2012-03-16 87 views
3

我在嘗試使用異步CTP構建運行異步並返回值的單個函數。異步HTTP使用異步CTP在單個函數中發佈數據

這裏是我的示例代碼。我不知道爲什麼它不回填「resp」變量。

public async Task<string> sendRequest(string url, string postdata) 
{ 
    WebClient client = new WebClient(); 
    byte[] data = Encoding.UTF8.GetBytes(postdata); 
    Uri uri = new Uri(url); 
    client.UploadDataAsync(uri,"POST", data); 
    string resp = ""; 
    await TaskEx.Run(()=> 
    client.UploadDataCompleted += (e, s) => 
    { 
     resp = System.Text.Encoding.UTF8.GetString(s.Result); 
    }); 
    return resp; 
} 

此外,我試過這個,但程序凍結(不做任何更多的不只是一段時間)。也許任何更正都可以幫助。

public async Task<string> sendRequest(string url, string postdata) 
{ 
    string resp = ""; 
    WebClient client = new WebClient(); 
    byte[] data = Encoding.UTF8.GetBytes(postdata); 
    Uri uri = new Uri(url); 
    data = await TaskEx.Run(()=>client.UploadData(uri,"POST", data)); 

    return System.Text.Encoding.UTF8.GetString(data); 
} 
+0

在開始上傳後,您正在訂閱活動。這意味着你有一個競爭條件。 – CodesInChaos 2012-03-16 11:20:36

+1

事實上有兩場比賽 - 一場@CodeInChaos提到,然後你最後的'await'正在等待,直到你*訂閱了事件 - 但不能保證事件已經發生。 – 2012-03-16 11:28:23

回答

0

在開始上傳之前,您應該訂閱UploadDataCompleted。不知道這是否對您的問題負責,但這是一個可能導致resp未被設置的錯誤。

+0

沒有工作.... – ShirazITCo 2012-03-16 11:26:23

+0

@ShirazITCo即使它不是你的直接問題的責任,它仍然是一個錯誤。 – CodesInChaos 2012-03-16 11:34:12

7

你可以,而是使用UploadDataTaskAsync擴展方法(CTP的一部分),而不必寫自己,管道代碼:

public async Task<string> sendRequest(string url, string postdata) 
{ 
    WebClient client = new WebClient(); 
    byte[] data = Encoding.UTF8.GetBytes(postdata); 
    Uri uri = new Uri(url); 
    resp = System.Text.Encoding.UTF8.GetString(await client.UploadDataTaskAsync(uri,"POST", data)); 
    return resp; 
} 

該擴展方法的實現正確處理該事件的訂閱,並確保在事件實際發生時完成任務。

+0

你完成了與我平行的任務。我提到,該計劃將凍結在「等待」。 – ShirazITCo 2012-03-16 11:37:29

+0

@ShirazITCo - 然後你將'POST'這個數據發送到的URL沒有響應 - 這與異步代碼無關(但會指出原來的錯誤是第二個錯誤 - 你原來的方法正在返回在'UploadDataCompleted'方法觸發之前 - 它實際上從未觸發)。 – 2012-03-16 11:51:11

+0

@ShirazITCo:你在某個時候正在做一個阻塞的「等待」或「結果」嗎?如果將'await client.UploadDataTaskAsync(..)'更改爲'await client.UploadDataTaskAsync(..)。ConfigureAwait(false)'是否有效? – 2012-03-17 01:31:42