2013-01-07 80 views
2

我想编写一个处理我的WebClient-Tasks并返回结果的类。
的问题是,异步下载不会让一个简单的return手柄:WebClient回拨异步结果?

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 
} 

我怎样才能把它放在一起,使其工作?

+0

您使用的是什么.NET版本?有了最新的一个,你可以使用'async/await',如果没有 - 你只能使用回调。 –

+0

我正在使用Visual Studio 2012.你能写出那段代码吗? –

回答

3

OK,与Visual Studio 2012和.NET 4.5更容易从System.Net.WebClient类使用UploadStringTaskAsync()方法:

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; 
} 

该方法抛出将中断就像一个普通的应用程序流量任何异常,非异步方法。在其他一些async标记方法

var availability = await CheckAvailability(); 

:确实注意到,虽然你有await这种方法无论你怎么称呼它得到的结果,也因此。

如果你不想用这个,你必须使用回调:

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将执行当上传完成,但您必须手动处理异常。

+0

'UploadStringTaskAsync'在Windows Phone 8 SDK上不可用? –

+0

我只需要安装一个NuGet包。非常感谢你! –

+0

@LuziusL没问题,很高兴我能帮忙:) –

0

usse UploadStringTaskAsync确实是一个更好的选择!

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

帖子数据不需要“?”