我有一个只有两个功能的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
答案 0 :(得分:5)
我假设您在主线程上执行join-loop。这意味着消息循环将停止,直到最后一个线程完成,从而打败多线程。它会阻止所有事件的处理,包括按钮点击。
除此之外,您不应该使用Thread.Abort()
你必须考虑一个更好的计划
答案 1 :(得分:3)
调用Join
强制你的主线程等待所有其他线程并抵消你的多线程,正是你不想要的。调用Abort
放弃该线程并阻止您从中获取任何结果。不要那样做。
可以设置一个带回调的线程来返回结果,并轮询以查看是否应该取消该线程,但最简单的方法是使用BackgroundWorker
,一个.Net类专门为你做的正在努力做到。 Code Project有一个很好的tutorial。