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

好的,使用 Visual Studio 2012 和 .NET 4.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");
}

现在您必须传递返回void并获取两个类型参数的函数Exception,该函数string将在上传完成时执行,但您必须手动处理异常。

于 2013-01-07T12:12:11.767 回答
0

usse UploadStringTaskAsync 确实是更好的选择!

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

帖子数据不需要“?”

于 2013-03-27T10:02:49.127 回答