2014年4月6日日曜日

[Silverlight][C#]WebClientを同期的に実行する

Silverlight にて HTTP リクエストを簡易的に行う為に WebClient が用意されておりますが、実行すると非同期でリクエストされ、結果は送信した同じスレッド(UIスレッドにて実行したらUIスレッドに合流されているようです)で結果を受信します。

    var client = new WebClient();
    client.DownloadStringCompleted += (sender, e) =>
    {
        // 結果受信処理・・・
    };
    client.DownloadStringAsync(uri);


これを同期的に実行させたければ、1枚ラッピングしてあげればOKです。

    public static class SyncWebClient
    {
        public static string DownloadStrings(Uri uri)
        {
            var autoReset = new AutoResetEvent(false);
            DownloadStringCompletedEventArgs args = null;

            var client = new WebClient();
            client.DownloadStringCompleted += (sender, e) =>
                {
                    args = e;
                    autoReset.Set();
                };
            client.DownloadStringAsync(uri);
            autoReset.WaitOne(30000);

            if (args == null)
            {
                throw new Exception("HTTPリクエストタイムアウト");
            }
            if (args.Error != null)
            {
                throw (Exception)args.Error;
            }
            return (string)args.Result;
        }
    }

OpenFileも同様に実装できますねー。



0 件のコメント:

コメントを投稿