在WPF应用程序中而不是在控制台应用程序中具有死锁的异步计算

问题描述 投票:-1回答:1

我试图重现一个像这个例子中的死锁情况:

https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

这是我在控制台应用程序中运行的代码:

class Program
{
    static async Task<int> f()
    {
        var t = Task.Delay(1000);  //and not Task.Delay(1000).ConfigureAwait(false);
        await t;
        return 1; // line execute in a woker thread
    }
    static async Task g()
    {
        int p=await f();
    }

    static void Main(string[] args)
    {
        var t=g(); //0
        t.Wait();
    }
}

这段代码不阻塞:返回1在另一个线程中执行,虽然我还没写过Task.Delay(1000).ConfigureAwait(false);

但是这个wpf应用程序有一个僵局,因为我已经预见到了:

<Application x:Class="WpfApplication3.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:WpfApplication3"
         Startup="Application_Startup">
<Application.Resources>

</Application.Resources>

    public partial class App : Application
{


    public async Task<int> f()
    {

        var t = Task.Delay(1000)
        await t;
        return 1;
    }
    public async Task g()
    {
        int p = await f();
        a = 1 + p;
    }
    private void Application_Startup(object sender, StartupEventArgs e)
    {

        var t = g();
        t.Wait();

    }
}

我不明白为什么控制台应用程序在没有死锁的情况下工作但是wpf应用程序有死锁。

谢谢您的帮助

c# async-await
1个回答
2
投票

来自https://blogs.msdn.microsoft.com/pfxteam/2012/01/20/await-synchronizationcontext-and-console-apps/

SynchronizationContext.Current在控制台应用程序中为空,从而避免了Stephen Cleary在帖子中描述的死锁。

© www.soinside.com 2019 - 2024. All rights reserved.