尝试只完成各种线程中的一个线程

本文关键字:线程 一个 | 更新日期: 2023-09-27 17:59:47

首先,我必须澄清,我对处理线程非常陌生。现在,我有一个应用程序,它可以在不同的时间执行多个线程。我的意思是,我有一些对象,它们中的每一个都在某个时刻执行一个线程。

我会更具体一点。我有一个任务列表,每个任务都与一个特定的对象相关联。当我单击一个按钮(应用于该对象)时,关联的任务开始运行。在某个特定的时刻,我可以拥有多个线程。这是正确的。问题是当我完成其中一个时。我完成了一个线程,其余的也都停止了。

当然,在我的实现中有一些错误。我不明白为什么所有线程都停止了。

以下是我的实现(我在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"类型的异常

我一直在搜索,也看到了这些问题

  • 类型';System.Threading.ThreadAbortException';发生在mscorlib.dll中
  • mscorlib.dll中出现System.Threading.ThreadAbortException,持续发生
  • 仅停止一个线程
  • 多线程C#Windows窗体

但是没有人帮我。

如果需要更多信息,请告诉我。

尝试只完成各种线程中的一个线程

为什么不使用Thread类,而使用Tasking Library?(参考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)