【发布时间】:2017-08-30 10:09:04
【问题描述】:
我有以下 winforms 事件
public MainForm()
{
InitializeComponent();
new Form().ShowDialog(); // This causes the problem
}
private async void MainForm_Load(object sender, EventArgs e)
{
LoadingLabel.Text = "Initializing...";
try
{
await Task.Delay(500);
}
catch (Exception ex)
{
MessageBox.Show("Error initializing");
Environment.Exit(0);
}
Console.WriteLine(LoadingLabel.InvokeRequired);
}
预期:程序打印false。
结果:程序打印true。
据我了解,await 应该将同步上下文设置回原来的状态,并且不需要 Invoke。然而,这种情况并非如此。尝试更新LoadingLabel 的Text 属性会引发InvalidOperationException。我错过了什么吗?
我正在使用 .NET 4.5.2。
【问题讨论】:
-
代码在我的机器上打印
false,当然除非我输入ConfigureAwait(false)。您能否仅使用您发布的代码重现此问题,或者是否有其他任何可能影响结果的内容? -
我有全局变量和其他函数+事件,但显示了该函数中的所有代码。上面的确切代码对我来说会出现问题。
-
@JSteward 你是对的。我已编辑问题以包含有问题的代码。
-
ShowDialog不是构造函数中通常使用的东西,因为它会阻塞直到对话框关闭。如果您可以等到加载MainForm后再显示您的对话框,则将调用移至MainForm_Load将不再需要Invoke -
我需要在表单出现之前显示我的对话框。我在构造函数中这样做是为了设置一个只读变量。您能解释一下为什么我的代码会导致这种意外行为吗?
标签: c# winforms async-await