2

我有一个只有两个功能的 Windows 窗体:第一个是在数据库中加载一些行,第二个功能是使用给定数量的线程处理这些行,因为处理速度在我的项目中非常重要,这就是为什么我不能考虑不使用多线程的选项。

我想添加停止执行进程的选项的问题,这意味着如果发生任何问题,则停止所有当前线程,以便用户指定另一个线程并再次重新启动执行,但我的 Windows 窗体似乎冻结和执行在所有线程正常完成工作后进入停止方法。

在处理按钮单击事件的更详细信息中,我将启动所有线程,然后循环所有线程

for (int i = 0; i < threads.Length; i++)
{
      threads[i].Join();
}

在按钮单击事件中停止我

for(int i=0;i<threads.Length;i++)
{
     if(threads[i].IsAlive)
     threads[i].Abort();
}

我注意到,如果我评论加入部分,界面能够响应停止事件点击。

但我不想这样做,因为我想区分所有线程完成执行的那一刻,这就是我加入 pa 的原因

4

2 回答 2

5

我假设您在主线程上执行连接循环。这意味着消息循环会暂停,直到最后一个线程完成,从而击败多线程。它会阻止所有事件的处理,包括按钮点击。

另外,你不应该使用 Thread.Abort()

你将不得不想一个更好的计划

  • 线程代码应检查停止标志
  • 如果您绝对需要该连接模式,请从另一个线程执行。也许来自背景工作者。
于 2010-12-30T18:14:05.583 回答
3

调用Join会强制您的主线程等待所有其他线程并抵消您的多线程,这正是您不想要的。调用Abort会放弃线程并阻止您从中获得任何结果。不要那样做。

可以设置带有回调的线程以返回结果,并轮询以查看是否应取消线程,但最简单的方法是使用BackgroundWorker.Net 类,该类专门设计用于执行您尝试执行的操作。Code Project有一个很好的教程

于 2010-12-30T18:57:43.683 回答