C# 在Visual Studio 2012中使用.net 4.0上的Microsoft.Bcl.Async进行异步
尝试在Visual Studio 2012的.net 4.0上使用Microsoft.Bcl使用异步。结果没有显示出来C# 在Visual Studio 2012中使用.net 4.0上的Microsoft.Bcl.Async进行异步,c#,.net,visual-studio-2012,C#,.net,Visual Studio 2012,尝试在Visual Studio 2012的.net 4.0上使用Microsoft.Bcl使用异步。结果没有显示出来 private void button3_Click(object sender, EventArgs e) { byte[] resultBytes;// = ReceiveStringAsync().Result; Task<byte[]>[] tasks = new Task<byte[]&
private void button3_Click(object sender, EventArgs e)
{
byte[] resultBytes;// = ReceiveStringAsync().Result;
Task<byte[]>[] tasks = new Task<byte[]>[1];
tasks[0] = ReceiveStringAsync();
Task.WaitAll(tasks, -1);
resultBytes = tasks[0].Result;
MessageBox.Show("Async Mode called in sync - " + data.Length.ToString());
}
public async Task<byte[]> ReceiveStringAsync()
{
string strURL = @"https://testurl.com";
WebClient client = new WebClient();
byte[] data = await client.DownloadDataTaskAsync(strURL).ConfigureAwait(true);
return data;
}
private void按钮3\u单击(对象发送者,事件参数e)
{
字节[]resultBytes;//=ReceiveStringAsync().Result;
任务[]任务=新任务[1];
任务[0]=ReceiveStringAsync();
Task.WaitAll(tasks,-1);
结果字节=任务[0]。结果;
Show(“在sync中调用异步模式-”+data.Length.ToString());
}
公共异步任务ReceiveStringAsync()
{
字符串strURL=@”https://testurl.com";
WebClient客户端=新的WebClient();
字节[]数据=等待客户端。下载DataTaskAsync(strURL)。配置等待(true);
返回数据;
}
这就是问题所在,与您使用的.NET 4无关:
Task.WaitAll(tasks, -1);
这将阻止,直到任务中的所有内容完成。在这一点上,你的UI线程不能做更多的工作。。。但是它必须做更多的工作才能在wait
表达式之后恢复ReceiveStringAsync
中的代码。因此,您的任务只有在task.WaitAll
完成后才能完成,而这项任务只有在任务完成后才能完成,并且您处于死锁状态
这里的教训是永远不要在UI线程中使用阻塞调用,如Task.WaitAll
(或Task.Result
或Task.Wait()
)
解决方案是使按钮3\u单击
async,这样您就可以等待由ReceiveStringAsync
返回的任务
private async void button3_Click(object sender, EventArgs e)
{
byte[] resultBytes = await ReceiveStringAsync();
// Not clear what data is here, but that's a different matter...
MessageBox.Show("Async Mode called in sync - " + data.Length.ToString());
}
顺便说一句,ReceiveStringAsync
方法返回一个任务而不是任务
。asyc是在.net 4.5/c#5中引入的。您确定这段代码没有任何错误吗?在.Net 4中,没有Async
…如果使用C#5.0编译器,则可以在.Net 4.0中与Microsoft.Bcl.Async库一起使用Async/await。不,它没有错误,工作正常,可以获取url,但无法提供数据。除此之外,可能存在重复的问题,但是对于async void
处理程序来说,确保它们有一些try
/catch
处理是一个非常好的主意-非常糟糕的事情otherwise@MarcGravell:正确-但您是否有提供更多详细信息的链接?(我不想把大量的细节放在一边,但最好能进一步阅读。请随意直接编辑。)@MarcGravel,谢谢你的更正,但我发现我不能将等待添加到按钮3上,因为它没有等待。@BojanShivShanker如果你看,Jon在答案中的方法声明中添加了async
;因此,您应该能够wait
,假设您的编译器支持async
/wait
@marcGravel,而且,删除“Task.WaitAll(tasks,-1)”也没有帮助,事实上,我后来添加了它,因为前面的代码不起作用。还有什么想法吗?