我试图创建一个返回值的异步方法。使用方法而不返回时一切正常。您可以处理数据,但添加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;
}
答案 0 :(得分: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
方法。你是否真的可以避免它,取决于你如何称呼它。
答案 1 :(得分: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
明确启动的任务。我很想知道生成的代码是什么样的......当然,在生产代码中使用.NET 4.5中的适当类。