【发布时间】:2011-07-22 11:09:07
【问题描述】:
我故意在 Windows 窗体应用程序中滥用消息循环,但我的“只是为了好玩”项目很快就超出了我的理解水平。任务运行时,表单无响应。是的,还有很多其他类似的问题,但就我而言,我故意避免在另一个线程上工作(为了赢得与自己的赌注?)
我有一个在 UI 线程上运行(许多)短时间的函数:get_IsComplete() 检查任务是否完成; DoWork() 从 0 循环到 1000(只是为了保持 CPU 温暖)。该任务通过调用control.BeginInvoke(new Action(ContinueWith), control); 启动,然后它(尾部递归)调用自身直到完成,始终在 UI 线程上运行一小段工作。
public void ContinueWith(Control control)
{
if (!IsComplete)
{
DoWork();
OnNext(control);
control.BeginInvoke(new Action(ContinueWith), control);
}
else
{
OnCompleted(control);
}
}
我希望应用程序处理其他事件(鼠标单击、控件重绘、表单移动等),但似乎我的调用获得了比我想要的更高的优先级。
有什么建议吗?
【问题讨论】:
-
Hans 是正确的,你没有这样的地方,执行永远不会离开函数。我想说的是,你可以通过使用计时器来避免它,但他也这么叫!不要像这样使用调用 / BeginInvoke。无论如何,在多线程情况之外这样做是毫无意义的;你可以直接调用代码。在你继续之前,请点击他的链接;这是一个非常简洁的解释。大多数 90 年代的区域 C windows API 程序员会在这上面写 20 段(我最不耐烦的用户谢谢你,Hans)。
标签: c# winforms multithreading