将Application.UseWaitCursor设置为false后,为什么我的Control.Cursor卡在Cursor.WaitCursor上

时间:2017-02-14 14:13:37

标签: c# winforms async-await

我有一个名为displayPanel的小组。在此面板中,我显示UserControl,具体取决于使用以下方法的方法单击按钮行中的哪个按钮:

private void button_Click(Object sender, EventArgs e)
{
    displayPanel.Controls.Clear();
    displayPanel.Controls.Add(UserControl);
}

在其中一个用户控件中,我有一个方法:

private void StartWork()
{
    Cursor.Current = Cursors.WaitCursor;
    DoWork();
    Cursor.Current = Curors.Default;
}
然后我将其更改为:

private async void StartWork(Object sender, EventArgs e)
{
    Application.UseWaitCursor = true;
    await DoWork();
    Application.UseWaitCursor = false;
}

这样我就可以更改UserControldisplayPanel显示的DoWork(),同时DoWork()在后​​台忙碌。启动DoWork()而不更改用户控件会显示等待光标直到DoWork()完成,然后再次显示默认光标。

启动DoWork()然后更改显示的用户控件也会显示等待光标直到DoWork()完成,然后再返回默认光标。然而!如果我现在更改回启动UserWaitCursor的用户控件,则表示usercontrol显示等待光标。

打印Cursor初始用户控件的所有DoWork()false属性,分别显示Cursor.WaitCursorfalse。 (而不是预期的:Cursor.DefaultUserControl.UseWaitCursor = !UserControl.UseWaitCursor

现在我发现我可以通过两次调用UserControl.Cursor来“修复”我的问题。但这感觉不对,我宁愿正确地修复它。这让我想到了一个问题:在Cursor.WaitCursor中将Application.UseWaitCursor设置为false后,为什么DoWork()卡在data3 = {k1: dict(Counter(v1) + Counter(v2)) for (k1, v1), (k2, v2) in zip(data1.items(), data2.items())}

编辑:我做了一个简单的项目,我可以重现这个问题。在下面的pastebin中有一个表单和2个用户控件,可以重现这个标记的问题:http://pastebin.com/PUkvJxMw

0 个答案:

没有答案