为什么沙漏(等待光标)会停止旋转?

5

我在按钮点击事件中有以下代码:

try
{
    Cursor = Cursors.WaitCursor;
    GenerateReports();
}
finally
{
    Cursor = Cursors.Default;
    GC.Collect();
    GenPacketBtn.Enabled = true;
}

光标只有在finally块中才会被设置回默认值,但是由于某些原因它可能会“累了”并恢复为其默认状态。为什么会这样,并且我该如何确保它不会停止“等待”,直到所有进程的大头儿子(GenerateReports())完成?


1
GenerateReports是异步的吗? - Jonathan Carroll
不,我没有异步代码。 - B. Clay Shannon-B. Crow Raven
没有理由它会“停止等待”GenerateReports()完成。我们能看一下那个函数里面是什么吗? - Jonathan Carroll
1
我已经多年没有使用 Windows Forms 了,连光标都很少用,但猜测一下,你确定这不是一个时间问题吗?这可能与某个控件未按预期继承光标有关,或者其他类似的问题吗?除此之外,如果是时间问题,那么大约总是相同的时间吗?如果是这样,那么在调用 GenerateReports() 之前加入 Thread.Sleep 是否可以延长这段时间呢? - Matthew Haugen
1
我已经很久没有使用Winforms了,但我记得必须在长时间运行和阻塞调用中加入Application.DoEvents()以便让UI有时间更新/重绘。https://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents(v=vs.110).aspx - Paul
1个回答

3
请使用 Control.UseWaitCursor = true 代替 Cursor.WaitCursor,这样不会超时。
如果正在执行一个昂贵的操作,Windows 将接管并将 Cursor.WaitCursor 更改为它认为必要的任何内容。所以使用 Cursor.WaitCursor 可能会由于超时(但不完全确定)或者因为 Windows 简单地声称拥有光标而不考虑其先前的状态而更改。我们还遇到了类似的情况,当执行涉及调用第三方 PDF 转换器的昂贵任务时,光标的行为与预期不同,但由于这不是优先事项,我们没有进一步调查问题的本质。
经过一些阅读,发现设置沙漏光标比看起来要复杂一些: .net WaitCursor: how hard can it be to show an hourglass? 此外,作为一个附注:您应该使用 Cursor.Current = Cursors.WaitCursor,因为这会立即强制将光标更改为繁忙状态,更多详细信息请参见:https://dev59.com/tHVC5IYBdhLWcg3wbQXA#302865

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接