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 は呼び出されません。

明らかにwin32メッセージループがあるWindowsフォームアプリを作成しても、同じことが起こります。

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

マークは正しいです。SynchronizationContext最新の Windows フォーム コントロールは、作成時に現在のスレッドで WinForms を確立します。

したがって、SomeTaskはその継続を Win32 メッセージ ループにスケジュールしますが、そのメッセージ ループを処理するスレッドはありません (例: Application.Run)。

于 2013-06-28T22:56:37.150 に答える