我正在使用線程從互聯網下載東西。 我的線程方法中沒有任何循環。我使用的是StreamReader.ReadToEnd()
方法,所以 當我的線程正在下載一些大的東西時,我想停止這個線程。最好不使用Thread.Abort()方法。 是否有可能給GC線程清理,或完成此?如何在C#中立即殺死線程
3
A
回答
12
不要做ReadToEnd
,而是創建一個循環並一次讀取X個字符(或者每次用ReadLine
讀取一行)。在循環內檢查是否設置了AutoResetEvent
(使用.WaitOne(0)
),如果是,則退出循環。
當您想停止下載時,在其他線程中設置重置事件(使用Set
)。
2
您可以使用BaseStream BeginRead()異步方法。你最好使用它而不是產生你自己的專用線程(它消耗1MB的提交內存)。異步方法在使用I/O完成端口時效率更高。
new StreamReader(aStream).BaseStream.BeginRead()
這裏有更多的一些信息http://msdn.microsoft.com/en-us/library/system.io.stream.beginread.aspx
上停止異步讀一個相關的線程。
0
喬治·達克特說什麼,但你可以使用.NET 4中Task
類啓動線程/異步任務,並通過在CancellationToken
和循環檢查,如果IsCancellationRequested
=真
相關問題
- 1. 老問題:如何立即殺死一個線程在c#
- 2. 如何殺死C#中的線程?
- 3. 立即殺死一個正在運行的線程未來
- 4. 如何殺死一個C#線程?
- 5. C#如何殺死父線程
- 6. 用pthreads殺死線程 - C
- 7. 如何殺死主線程?
- 8. 如何殺死MFC線程?
- 9. 在java中殺死線程
- 10. 按Ctrl-C,即一個KeyboardInterrupt殺死線程在python
- 11. 如何在退出時殺死線程?
- 12. 我如何殺死python中的線程
- 13. 如何殺死Haskell中的線程
- 14. 如何殺死服務中的線程?
- 15. 如何在C中處理/殺死一個鎖定線程#
- 16. 殺死線程在pthread庫
- 17. 一個線程如何在另一個線程中被殺死
- 18. 如何知道何時殺死線程?
- 19. pthread_kill不殺死線程C linux
- 20. C#殺死所有的線程
- 21. C++殺死等待std ::線程
- 22. 殺死線程強行C++的Win32
- 23. 如何殺死線程+ .net + System.AddIn
- 24. 如何殺死觀看服務線程
- 25. 如何殺死/停止後臺線程?
- 26. 如何殺死一個線程?
- 27. 如何停止/殺死Rengine線程
- 28. 後來在Python中殺死線程
- 29. 在SwingUtilities.invokeLater()中殺死一個線程
- 30. 在java中殺死一個線程android
+1。讀取結束非常糟糕 - 僞造無中止,您可能還會使用大量的內存,否則可能無法分配啓動(64或128k緩衝區可能就足夠了)。 – TomTom 2012-03-18 11:55:20
使用StreamReader不會讀取X字節。用ReadLine()替換這個想法 – 2012-03-18 14:07:45