代码之家  ›  专栏  ›  技术社区  ›  Sebastian Busek

异步/等待在Windows窗体应用程序中有效,但不应如此

  •  0
  • Sebastian Busek  · 技术社区  · 6 年前

    基于 MSDN article 下面的代码不应该在Windows窗体应用程序中工作,我非常肯定,它在过去不工作,但最近我发现在.NET Framework 4.7.02558中工作。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        public void Test()
        {
            Console.WriteLine("One");
    
            var d = DelayAsync();
    
            Console.WriteLine("Three");
    
            d.Wait();
            Console.WriteLine("Five");
        }
    
        private async Task DelayAsync()
        {
            Console.WriteLine("Two");
    
            await Task.Delay(1000);
            Console.WriteLine("Four");
        }
    
        private void Button1_Click(object sender, EventArgs e)
        {
            Test();
        }
    }
    

    我是否错过了一些发布日志,或者有什么问题(我的意思是从用户的角度看是正确的)?

    编辑:应用程序应该在从等待的代码返回后冻结,因为在Windows窗体中使用了CurrentContextScheduler。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Bradley Uffner    6 年前

    在4.7.1上的测试得到以下结果:



    Four Five 永远不会出现。对我来说,它似乎“没有按预期工作”,就像执行 await Task.Delay(1000); 正在阻塞。

        2
  •  0
  •   Sebastian Busek    6 年前

    发现。问题是由resharper build&run引起的。出于某种原因,未完成生成,从Resharper生成程序切换到Visual Studio生成程序的行为“正确”。 最新生成是用 .ConfigureAway(false) 这就是为什么它起作用而不应该起作用的根本原因。