当我的C#Windows窗体搅动循环时,如何保持其响应速度?

当我的C#Windows窗体搅动循环时,如何保持其响应速度?,c#,visual-studio,C#,Visual Studio,我有一个巨大的嵌套循环场景,它调用DB并向Basecamp API发出HTTP请求。起初它是一个web应用程序,但运行该应用程序需要很多时间,因此用户(计费部门)通常会提前退出或抱怨,因为这需要很长时间,没有反馈,也无法取消。我想让它更灵敏,给它一个取消按钮和一个实时日志,我还想让它更可控。我把它放在表单中,这样他们就可以控制它的每个实例,并有一个取消按钮和一个实时日志 然而,当我用表单按钮、多行文本框来替换响应和错误日志时,我什么也做不到!我在循环中添加了检查,以便在按下“取消”时中断。但是,

我有一个巨大的嵌套循环场景,它调用DB并向Basecamp API发出HTTP请求。起初它是一个web应用程序,但运行该应用程序需要很多时间,因此用户(计费部门)通常会提前退出或抱怨,因为这需要很长时间,没有反馈,也无法取消。我想让它更灵敏,给它一个取消按钮和一个实时日志,我还想让它更可控。我把它放在表单中,这样他们就可以控制它的每个实例,并有一个取消按钮和一个实时日志

然而,当我用表单按钮、多行文本框来替换响应和错误日志时,我什么也做不到!我在循环中添加了检查,以便在按下“取消”时中断。但是,我甚至不能单击“取消”,当I.Text.Insert然后.update()更新时,多行
文本框将不会实时更新。整个应用程序只是坐在那里旋转。。。如何使其响应,在循环过程中接受按钮点击,并实时更新多行
文本框

注意:这个东西编译得很好,我可以一步一步地完成它,它会很好地写入一个日志文件,这样我就可以在我的表单冻结后通过查看该日志文件来判断它是否正常工作

以下是我试图更新多行
文本框的代码:

TimeSyncLog.Text.Insert(TimeSyncLog.Text.Length, "(((" + clientCode + ")))\n");
下面是我的循环突破的代码:

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

但是我永远不能单击取消按钮来切换该
布尔值
,因为窗口显示“没有响应”…

您不应该在UI线程上执行任何耗时的业务逻辑。 您可以使用BackgroundWorker类来处理这类事情。它还支持取消和进度报告


您可以阅读它。

UI线程中应该只有与UI相关的更改。与你的问题毫不相干,这里有一个很棒的线程教程


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

一个好的阅读来源:教程似乎已经过时了。尝试将参数传递给thread.start()方法会告诉我它们的类型错误。