【问题标题】:Why does this code hang when I use Console.WriteLine to print an async method's result?为什么当我使用 Console.WriteLine 打印异步方法的结果时,此代码会挂起?
【发布时间】:2019-02-01 23:42:38
【问题描述】:

这是我的 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 方法打印“2”时,它可以工作。

【问题讨论】:

    标签: c# wpf c#-5.0


    【解决方案1】:

    atest().Result 是同步调用,导致死锁(await Task.Delay(10) 的延续试图在 UI 线程上运行,被你的调用阻塞)。

    两个可能的修复:

    1. (首选解决方案)等待结果而不是使用Result 属性:

      var result = await atest();
      System.Console.WriteLine(result);
      
    2. 更改您的异步调用,以便继续不会在 UI 线程上运行:

      await Task.Delay(10).ConfigureAwait(false);
      

      var result = await Thread_sleep().ConfigureAwait(false);
      

    根据经验,切勿在 WPF 应用程序中的任务上使用 .Result.Wait(),除非您绝对确定需要这样做。始终尝试使用await

    【讨论】:

    • 谢谢。我想我应该更加小心地理解 c# 中的 await :)
    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2014-04-08
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多