如何提前关闭工作线程

本文关键字:工作 线程 何提前 | 更新日期: 2023-09-27 18:11:39

我有多个工作线程,其中每个工作线程下载一个音频文件。当用户关闭下载这些音频文件的表单时,我希望所有这些工作线程都停止运行。

我正在使用一个库,它为我下载音频文件。所以我要做的就是下载audioDownloader.Execute();。这意味着我没有使用我在msdb上看到的用于提前结束线程的while循环。

我已经尝试在DownloadForm_FormClosing上中止线程,但当我试图重新打开下载表单时,音频文件将不再开始下载。我也试过使用thread.Join(),但形式只是冻结…下面是我使用的代码:

//DownloadForm.cs
private void DownloadForm_FormClosing(object sender, FormClosingEventArgs e)
{
    isdownloadformclosing = true;
    //each AudioFile holds a thread
    foreach(AudioFile v in AudioFiles)
    {
        v.thread.Abort();
        v.thread = null;
    }
}

//AudioFile.cs
try
{
    AudioDownloader.Execute();
}
catch(Exception e)
{
   if(!DownloadForm.isdownloadformclosing)
      DownloadForm.ShowErrorForId(this.Id, e);   
}

如何提前关闭工作线程

. .当我试图重新打开下载表单时,音频文件将不再开始下载

你不能重新启动**Abort**线程

一旦线程终止,它就不能通过再次调用Start来重新启动。

线程。Start方法

你可以为你的"重新打开"做些什么,例如:

protected Thread tDownloader;
...
if(tDownloader == null || tDownloader.ThreadState == ThreadState.Unstarted || tDownloader.ThreadState == ThreadState.Stopped)
{
    tDownloader = new System.Threading.Thread(() => { 
    ...TODO...
    });
    ....
    tDownloader.Start();
}

参见ThreadState枚举了解更多细节

线程。Abort -在调用它的线程中引发ThreadAbortException,以开始终止线程的过程

调用后,ThreadState状态为Aborted,但还没有变为Stopped.

如果没有看到这个AudioDownloader或AudioFile类的代码,我们真的不能告诉太多…要么AudioDownloader应该有一个cancel方法(内部)处理它需要的一切,要么你需要检查AudioFile中发生了什么导致问题。

我怀疑,如果它不期望它的'线程'对象被设置为null,当你试图重用对象它不喜欢它,因为它不再有一个线程…试着在每次表单加载时重新创建AudioDownloader对象-这应该会让它像再次从拉伸开始一样启动。

就像我说的,没有更多的代码,我们能做的就不多!