首先,我必须澄清一点,我是一个非常新的线程。现在,我有一个应用程序,它在不同的时间执行多个线程。我的意思是,我有一些对象,每个对象都会在某个时刻执行一个线程。
我会更具体。我有一个任务列表,每个任务都与特定对象相关联。当我单击一个按钮(适用于该对象)时,相关的任务开始运行。在某个时刻,我可以拥有多个线程。这工作正常。问题是当我完成其中一个时。我完成了一个主题,所有其余的都停止了。
当然,我的实施有些不对劲。我不明白为什么所有线程都被停止了。
这是我的实现(我在Windows应用程序表单上的MVC中工作):
我有主要表格
//This method starts when I press a button from a specific object
private void StartTask( int idtask )
{
int counter = this.Controller.GetTasksSize(); //This is a List<ObjectTask>, this method returns the count
for (int i = 0; i < counter; i++)
{
//GetTasks() returns the List<ObjectTask>
if (this.Controller.GetTasks()[i].idtask == idtask)
{
ThreadStart tsTask = new ThreadStart(() => TaskLoop(this.Controller.GetTasks()[i].idtask,
this.Controller.GetTasks()[i].time,
this.Controller.GetTasks()[i].Mode));
Thread task = new Thread(tsTask);
this.Controller.GetTasks()[i].task = task;
this.Controller.GetTasks()[i].task.Start();
task = null;
break;
}
}
}
private void StopTask(int idtask)
{
int counter = this.Controller.GetTasksSize();
for (int i = 0; i < counter; i++)
{
if (this.Controller.GetTasks()[i].idtask == idtask)
{
try
{
if (this.Controller.GetTasks()[i].task != null && this.Controller.GetTasks()[i].task.IsAlive)
this.Controller.GetTasks()[i].task.Abort();
}
catch (ThreadAbortException e)
{
}
break;
}
}
}
我的ObjectTask列表是
public class ObjectTask
{
private int idtask;
public int idtask
{
get { return idtask; }
set { idtask = value; }
}
private int time;
public int time
{
get { return time; }
set { time = value; }
}
private bool Mode;
public bool Mode
{
get { return Mode; }
set { Mode = value; }
}
private Thread task;
public Thread task
{
get { return task; }
set { task = value; }
}
}
同时,当我停止一个线程时,我可以在控制台上看到以下消息:
线程''(0x1764)已退出,代码为0(0x0)。 mscorlib.dll中出现'System.Threading.ThreadAbortException'类型的第一次机会异常
我一直在寻找,也看到了这些问题
但没有人帮助我。
如果有必要提供更多信息,请告诉我。
答案 0 :(得分:1)
为什么不使用任务库,而不是使用Thread类? (REF https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.run(v=vs.110).aspx)
然后您可以使用WaitAll函数等待所有任务完成。 (参考https://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx)