多线程时c#windows窗体不响应

时间:2010-12-30 18:05:55

标签: c# multithreading join abort

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

问题依赖于我想添加停止执行进程的选项,这意味着如果出现任何问题就停止所有当前线程,以便用户指定另一个nr个线程并重新开始执行,但我的Windows窗体似乎在所有线程正常完成工作后,冻结和执行进入停止方法。

在处理按钮点击事件中更详细地说,我正在启动所有线程和 之后我循环所有线程

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

在按钮点击事件中停止I

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

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

但我不想那样做,因为我想区分所有线程完成执行的那一刻,为什么我加入了pa

2 个答案:

答案 0 :(得分:5)

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

除此之外,您不应该使用Thread.Abort()

你必须考虑一个更好的计划

  • 线程代码应检查停止标志
  • 如果您绝对需要join-patten,请从另一个线程执行。也许来自背景工作者。

答案 1 :(得分:3)

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

可以设置一个带回调的线程来返回结果,并轮询以查看是否应该取消该线程,但最简单的方法是使用BackgroundWorker,一个.Net类专门为你做的正在努力做到。 Code Project有一个很好的tutorial