这是我的WPF代码。
public partial class MainWindow : Window
{
delegate Task<int> testasync();
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
testasync atest = new testasync(async () => { var result = await Thread_sleep(); return result; });
System.Console.WriteLine("begin");
System.Console.WriteLine("1");
System.Console.WriteLine(atest().Result);
System.Console.WriteLine("3");
}
async public Task<int> Thread_sleep()
{
await Task.Delay(10);
return 2;
}
}
我希望结果是1,3,2,但它会挂起。但是,当我使用Thread_sleep
方法打印&#39; 2&#39;时,它可以正常工作。
答案 0 :(得分:1)
atest().Result
是一个同步调用,导致死锁(await Task.Delay(10)
的延续尝试在UI线程上运行,被您的调用阻止)。
两种可能的修复方法:
(首选解决方案)等待结果,而不是使用Result
属性:
var result = await atest();
System.Console.WriteLine(result);
更改异步调用,以便不在UI线程上运行continuation:
await Task.Delay(10).ConfigureAwait(false);
和
var result = await Thread_sleep().ConfigureAwait(false);
根据经验,永远不要在WPF应用程序中的任务上使用.Result
或.Wait()
,除非您完全确定需要。请务必尝试使用await
。