0

値を返す非同期メソッドを作成しようとしています。リターンなしでメソッドを使用すると、すべてが機能します。データを処理できますが、return 句を追加すると問題が発生します。プログラムはエラーなしで完全にフリーズするか、しばらくの間フリーズします。

コードを見てください:

public void runTheAsync(){
   string resp = sendRequest("http://google.com","x=y").Result;
}

public async Task<string> sendRequest(string url, string postdata)
{
    //There is no problem if you use void as the return value , the problem appears when Task<string> used. the program fully go to freeze.
    Console.WriteLine("On the UI thread.");

    string result = await TaskEx.Run(() =>
    {
        Console.WriteLine("Starting CPU-intensive work on background thread...");
        string work = webRequest(url,postdata);
        return work;
    });

    return result;
}

public string webRequest(string url, string postdata)
{
    string _return = "";
    WebClient client = new WebClient();
    byte[] data = Encoding.UTF8.GetBytes(postdata);
    Uri uri = new Uri(url);
    _return = System.Text.Encoding.UTF8.GetString(client.UploadData(uri, "POST", data));
    return _return;
}
4

2 に答える 2

2
string resp = sendRequest("http://google.com","x=y").Result;

それはあなたの問題だ。を呼び出すResultと、が終了Taskするまでブロックされます。Task

代わりに、これを行うことができます:

public async void runTheAsync()
{
   string resp = await sendRequest("http://google.com","x=y");
}

ただし、async voidメソッドの作成は避ける必要があります。実際に回避できるかどうかは、呼び出し方によって異なります。

于 2012-03-16T18:40:06.310 に答える
0

これを試してみてください。データの正確性チェックなどは省略されましたが、無視されました:-):

public async Task<string> UploadRequestAsync(string url, string postdata) 
{  
    string result = await Encoding.GetString(
        new WebClient().UploadData(new Uri(uri), "POST", Encoding.UTF8.GetBytes(postdata)));
    return result; 
} 

どういうわけかawait、明示的に開始されたタスクを ing して、作業を 2 回行っています。このために生成されたコードがどのように見えるかを知りたいです...そしてもちろん、本番コードでは、.NET 4.5 の適切なクラスを使用します。

于 2012-03-16T18:32:21.273 に答える