c# - 如何让我的 C# Windows 窗体在搅动循环时保持响应?

标签 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;
}

但我永远无法单击“取消”按钮来切换该 bool 值,因为窗口显示“无响应”...

最佳答案

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

你可以阅读它here .

关于c# - 如何让我的 C# Windows 窗体在搅动循环时保持响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1693612/

相关文章:

c# - 来自非请求工作线程的应用程序的 ASP.NET WebApi 基础 Uri

asp.net - 在设计 View 中根据需要标记控件属性

c# - 透明背景的用户控件

C# - 显示最大值、最小值和平均值

c# - 我们可以在 .net 网站中集成 Napster 吗?

c++ - 将 natvis 文件中 char* 的显示限制为特定长度

visual-studio - Visual Studio 在开始构建前挂起 20 秒

c# - 如何将关键字 `where` 用于多个泛型类型?

c++ - 带有附加控制台窗口的游戏窗口应用程序

c# - 如何存储从 SqlDataReader 返回的结果?