如何提前关闭工作线程

时间:2014-07-04 12:41:26

标签: c# multithreading

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

我正在使用一个为我下载音频文件的库。所以我要开始下载的所有工作都是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);   
}

2 个答案:

答案 0 :(得分:1)

  

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

您无法重启** Abort ** ed线程

  

一旦线程终止,则无法通过另一次调用Start来重新启动。

Thread.Start Method

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

protected Thread tDownloader;
...

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

请参阅ThreadState Enumeration了解更多详情

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

调用后,ThreadState具有Aborted状态,但其状态尚未更改为Stopped。

答案 1 :(得分:0)

如果没有看到这个AudioDownloader或AudioFile类的代码,我们真的无法说清楚... AudioDownloader应该有一个取消方法(内部)处理它需要的一切,或者你需要检查AudioFile中发生了什么导致问题。

我怀疑如果它不期望它的'thread'对象被设置为null,当你尝试重用它不喜欢它的对象时,因为它不再有一个线程...尝试重新创建每个AudioDownloader对象你的表单加载的时间 - 应该让它开始,好像它是从stratch再次开始。

就像我说的,没有更多代码,我们无能为力!