【发布时间】:2013-06-28 22:12:59
【问题描述】:
预期的结果是:
一些任务 主异步 主要
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 永远不会出现。
【问题讨论】:
-
猜测一下,创建控件会启动同步上下文,但没有活动的消息循环;这意味着它永远不会处理来自同步上下文的消息;同步上下文是......棘手
标签: c# asynchronous controls deadlock async-await