如何提前关闭工作线程
本文关键字:工作 线程 何提前 | 更新日期: 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对象-这应该会让它像再次从拉伸开始一样启动。
就像我说的,没有更多的代码,我们能做的就不多!