在我的 Winforms 应用程序中,当您启动操作时,它可能会或可能不会异步完成。在工作全部同步完成的情况下,我无法使用异步完成工作时使用的相同方法显示等待光标。
这是一个显示该问题的示例:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var t = ButtonClick(button1, DoWorkAsync1);
}
private void button2_Click(object sender, EventArgs e)
{
var t = ButtonClick(button2, DoWorkAsync2);
}
private async Task ButtonClick(Button btn, Func<Task> doWorkAsync)
{
// Disable the UI and show the wait cursor
btn.Text = "Working...";
btn.Enabled = false;
UseWaitCursor = true;
// Application.DoEvents(); // Inserting this causes the problem to go away.
await doWorkAsync();
// Simulate an update of the UI taking a long time
Thread.Sleep(2000);
// Renable the UI and stop showing the wait cursor
UseWaitCursor = false;
btn.Enabled = true;
}
private Task DoWorkAsync1()
{
// Work takes some time
return Task.Delay(2000);
}
private Task DoWorkAsync2()
{
// Work doesn't take any time, results are immediately available
return Task.FromResult<int>(0);
}
}
在这个例子中:
- 单击 button1 会显示等待光标(因为工作是异步完成的)。
- 单击 button2 不会显示Wait 光标(因为所有工作都是同步完成的)。
- 单击 button1 和 button2 会导致 UI 按预期被禁用。
需要的是,单击按钮 1 或按钮 2 应导致在单击按钮和 UI 更新工作完成之间的整个间隔内显示等待光标。
问题:
- 有没有办法在不插入
Application.DoEvent
(也没有任何会导致消息泵送发生的等效物)的情况下解决这个问题,或者只有通过泵送消息才有可能。 - 顺便说一句:为什么禁用控件可以正常工作(与光标不同)。