2013-01-07 153 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); 

帖子數據不需要「?」