我正在使用线程从互联网上下载内容。
我的线程方法中没有任何循环。我正在使用StreamReader.ReadToEnd()
方法,所以
当我的线程下载大的东西我想停止这个线程。最好没有Thread.Abort()方法。
是否可以给GC螺纹清洁,或完成这个?
答案 0 :(得分:12)
不要执行ReadToEnd
,而是创建循环并一次读取X个字符(或者使用ReadLine
一次读取一行)。在循环内检查是否设置了AutoResetEvent
(使用.WaitOne(0)
),如果是,则退出循环。
如果要停止下载,请在其他线程中设置重置事件(使用Set
)。
答案 1 :(得分:2)
您可以使用BaseStream BeginRead()异步方法。你最好不要使用它而不是产生你自己的专用线程(它消耗1MB的已提交内存)。异步方法在使用I / O完成端口时效率更高。
new StreamReader(aStream).BaseStream.BeginRead()
以下是更多信息http://msdn.microsoft.com/en-us/library/system.io.stream.beginread.aspx
停止异步读取的相关线程。
答案 2 :(得分:0)
George Duckett说的是你可以使用.Net 4 Task
类来启动线程/异步任务并传入CancellationToken
并在循环中检查IsCancellationRequested
= true < / p>