2

WebClient-Tasks を処理し、その結果を返すクラスを書きたいと思います。
問題は、非同期ダウンロードが単純なreturnハンドルを許可しないことです。

public void checkAvailability()
{
     WebClient wc = new WebClient();
     wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
     wc.UploadStringCompleted += wc_UploadStringCompleted;
     wc.UploadStringAsync(new Uri("http://random.php"), "?lookup=10");

     //return parsed content from wc_UploadStringCompleted
}

private void wc_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
{
     // do something
}

それを機能させるにはどうすればすべてをまとめることができますか?

4

2 に答える 2

3

OK、Visual Studio2012と.NET4.5では、クラスのUploadStringTaskAsync()メソッドを使用する方が簡単です。System.Net.WebClient

public async Task<string> CheckAvailability()
{
    var webClient = new WebClient();
    webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
    var result = await webClient.UploadStringTaskAsync(new Uri("http://random.php"), "?lookup=10");
    return result;
}

メソッドによってスローされた例外は、通常の非同期メソッドのようにアプリケーションフローを中断します。awaitただし、結果を取得するには、このメソッドを呼び出す場所でこのメソッドを使用する必要があることに注意してください。

var availability = await CheckAvailability();

他のasyncマークされた方法で。

これを使用したくない場合は、コールバックを使用する必要があります。

public void CheckAvailability(Action<Exception, string> callback)
{
    var webClient = new WebClient();
    webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
    webClient.UploadStringCompleted += (s,e) => { 
                                                    if(e.Error != null)
                                                        callback(e.Error, string.Empty);
                                                    else
                                                        callback(null, e.Result);
                                                };
    wc.UploadStringAsync(new Uri("http://random.php"), "?lookup=10");
}

ここで、タイプのvoid2つのパラメーターを返し、取得する関数を渡す必要があります。これは、アップロードが終了したときに実行されますが、例外を手動で処理する必要があります。Exceptionstring

于 2013-01-07T12:12:11.767 に答える
0

実際、UploadStringTaskAsync を使用する方が適切です。

string data = "lookup=10";
string json = await WebClient.UploadStringTaskAsync(Uri, data);

投稿データには「?」は必要ありません。

于 2013-03-27T10:02:49.127 に答える