如何在循环中保持C#Windows窗体响应?

时间:2009-11-07 16:38:24

标签: c# visual-studio

我有这个庞大的嵌套循环场景,它调用数据库并向Basecamp API发出HTTP请求。起初它是一个网络应用程序,但运行应用程序花了很多时间,因此用户(计费部门)经常会提前退出或抱怨,因为它需要很长时间没有反馈,也没有办法取消它。我想让它更具响应性并给它一个取消按钮以及一个实时日志,我也想让它更具可控性。我把它放在表单中,这样他们可以控制它的每个实例,并有一个取消按钮和一个实时日志。

然而,当我用表单按钮连接它时,多行文本框来替换响应和错误日志,我无法得到任何工作!如果按下取消,我在循环中添加了检查以突破。但是我甚至无法单击取消,当我.Text.Insert然后.Update()时,多行TextBox将不会更新。整个应用程序只是坐在那里旋转...如何让它响应,在循环过程中接受按钮点击,并实时更新多行TextBox

注意:事情编译得很好,我可以逐步完成它并且它写入日志文件就好了所以我可以告诉它在我的表单通过查看该日志文件冻结之后工作。

以下是我尝试使用以下内容更新多行TextBox的代码:

TimeSyncLog.Text.Insert(TimeSyncLog.Text.Length, "(((" + clientCode + ")))\n");

这是我的循环突破的代码:

if(CancelPressed)
{
    TimeSyncLog.Text.Insert(TimeSyncLog.Text.Length,"\n\nSYNC STOPPED BY USER.");
    break;
}

但我永远不能点击取消按钮来切换boolean因为窗口显示'无响应'...

2 个答案:

答案 0 :(得分:14)

您不应该在UI线程上花费任何时间来使用业务逻辑。 您可以将BackgroundWorker类用于这类事情。它还支持取消和进度报告。

您可以阅读here

答案 1 :(得分:0)

UI线程应该只有UI相关的更改。与您的问题半无关,有一个很棒的线程教程here.

BackgroundWorker是一个使用线程池的优秀类,尽管在线程时需要考虑很多选项和事项。如果要取消该线程,可以在GUI类中嵌套一个事件,以便工作者可以订阅它,以处理按下“取消”按钮的事件。也许这不是最有效的方式,但我相信这里的其他人可以推荐一些替代路线。希望这会有所帮助。