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

Ble*_*rta 2 c# multithreading join abort

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

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

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

for (int i = 0; i < threads.Length; i++)
{
      threads[i].Join();
}
Run Code Online (Sandbox Code Playgroud)

在按钮点击事件中停止我

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

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

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

Hen*_*man 5

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

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

你将不得不考虑一个更好的计划

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