0

预期结果将是:

SomeTask MainAsync Main

class Program
{
    static void Main(string[] args)
    {
        MainAsync().Wait();
        Console.WriteLine("Main");
        Console.ReadLine();
    }

    async static Task MainAsync()
    {
        await Task.Run(() => SomeTask());
        Console.WriteLine("MainAsync");
    }

    static async Task SomeTask()
    {
        TextBox tb = new TextBox();
        await Task.Delay(100);
        Console.WriteLine("SomeTask");
    }
}

但是,实际上没有调用任何 Console.Writeline。

即使我编写一个 Windows 窗体应用程序也会发生同样的事情,它显然有一个 win32 消息循环。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    protected async override void OnLoad(EventArgs e)
    {
        await MainAsync();
        MessageBox.Show("Done!");
        base.OnLoad(e);
    }

    async static Task MainAsync()
    {
        await Task.Run(() => SomeTask());

    static async Task SomeTask()
    {
        TextBox tb = new TextBox();
        await Task.Delay(100);
    }
}

MessageBox 永远不会出现。

4

1 回答 1

1

马克是正确的;现代 Windows 窗体控件在创建时将SynchronizationContext在其当前线程上建立一个 WinForms。

因此,SomeTask会将其继续安排到 Win32 消息循环上,但没有线程处理该消息循环(例如,Application.Run)。

于 2013-06-28T22:56:37.150 回答