2012-03-16 7 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

+1

2つのレースが実際には--CodeInChaosが言及し、あなたの最後の 'await'はイベントに*登録されるまで待っていますが、イベントが実際に起こったという保証はありません。 –

答えて

0

アップロードを開始する前に、UploadDataCompletedに加入する必要があります。それが問題の原因であるかどうかは不明ですが、respが設定されていないバグです。

あなたは、代わりに、その配管コードを自分で書かなければならない UploadDataTaskAsync拡張メソッド(CTPの一部)を使用して、ことができませんでした
+0

作業していません.... – ShirazITCo

+0

@ShirazITCoあなたの直ちに問題が発生しても、それはまだバグです。 – CodesInChaos

7

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

+0

@ShirazITCo - このデータをPOSTしているURLは応答していません - これは非同期コードとは関係ありません(ただし、元のエラーが識別された2番目のエラーであることを示します) 'UploadDataCompleted'メソッドが起動する前に、実際には起動しません)。 –

+0

@ShirazITCo:ある時点で「待機」または「結果」をブロックしていますか? 'await client.UploadDataTaskAsync(..)'を 'await client.UploadDataTaskAsync(..)。ConfigureAwait(false)'に変更すると動作しますか? –

関連する問題