Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Visual Studio 2012中使用.net 4.0上的Microsoft.Bcl.Async进行异步_C#_.net_Visual Studio 2012 - Fatal编程技术网

C# 在Visual Studio 2012中使用.net 4.0上的Microsoft.Bcl.Async进行异步

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[]&

尝试在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[]>[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)”也没有帮助,事实上,我后来添加了它,因为前面的代码不起作用。还有什么想法吗?