我有多个工作线程,其中每个工作人员都下载一个音频文件。当用户关闭下载这些音频文件的表单时,我希望所有这些工作线程都停止运行。
我正在使用一个为我下载音频文件的库。所以我要开始下载的所有工作都是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);
}
答案 0 :(得分:1)
..当我尝试重新打开下载表单时,音频文件不再开始下载
您无法重启** Abort ** ed线程
一旦线程终止,则无法通过另一次调用Start来重新启动。
你可以为你的"重新打开"做什么,例如:
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再次开始。
就像我说的,没有更多代码,我们无能为力!