【发布时间】:2013-12-28 21:08:52
【问题描述】:
所以,我正在创建一个下载管理器,并且我已经专门设计了每一点,以便它可以随时关闭,而无需给它时间清理。但是,我似乎无法找到杀死我的下载线程的方法。我尝试使用 Thread.Abort(实际上,这是我给他们时间清理的方式:他们捕获 ThreadAbortException 并自行处理),但正如您已经猜到的那样,这并不好。我会使用一个标志或其他东西,但是当一个线程正在等待网络操作完成时,它几乎完全被阻塞了。关于如何至少中断网络操作以便我可以在不等待明显时间的情况下关闭的任何想法?
以下是相关代码:
try
{
Request.AddRange(StartPosition, EndPosition);
Owner.SetDefaultRequestParameters(Request);
Response = Request.GetResponse() as HttpWebResponse;
ResponseStream = Response.GetResponseStream();
var Buffer = new Byte[Downloader.BUFFER_SIZE];
while (true)
{
Paused.Wait();
if (bStopRequested)
break;
int Count = ResponseStream.Read(Buffer, 0, Buffer.Length); //gets stuck here
if (Count == 0)
break;
MemoryStream.Write(Buffer, 0, Count);
Downloaded += Count;
CurrentStreak += Count;
if (StartPosition + Downloaded >= EndPosition)
break;
if (MemoryStream.Capacity - CurrentStreak < Buffer.Length)
{
Owner.WriteToFile(MemoryStream, StartPosition + Downloaded - CurrentStreak, CurrentStreak);
MemoryStream.Seek(0, SeekOrigin.Begin);
CurrentStreak = 0;
}
}
}
catch (ThreadAbortException)
{
try
{
Response.Close();
}
catch { }
return; //fastest way I have found to shut the thread down, yet
}
编辑:所以,我是这样做的:
if (Request != null)
Request.Abort();
if (Response != null)
Response.Close();
ExecutionThread.Abort();
这样,无论线程卡在哪里(获取响应或从响应流中读取),它都会被取消并立即停止。
【问题讨论】:
-
你试过使用
async/await吗?这样线程就不会在网络操作中阻塞了。 -
@BenVoigt - 解除阻塞线程和中断 I/O 不是一回事(这里)。
-
@Henk:是的,取消是一个单独的问题。无论驱动程序处理取消请求需要多长时间,资源都可能保持锁定状态。没有多少用户模式代码可以做到这一点。较新版本的 Windows 要好得多。但程序仍然可以继续执行其他操作,而不是阻止取消。
-
HttpWebRequest.Abort() 值得一试。
标签: c# .net multithreading kill