3

非同期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);
}
4

2 に答える 2

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

その拡張メソッドの実装により、イベント サブスクリプションが正しく処理され、イベントが実際に発生したときにタスクが完了することが保証されます。

于 2012-03-16T11:32:07.230 に答える
0

UploadDataCompletedアップロードを開始する前に、購読する必要があります。それが問題の原因かどうかはわかりrespませんが、設定されていない可能性があるバグです。

于 2012-03-16T11:23:35.953 に答える