2012-03-18 8 views
3

インターネットから何かをダウンロードするスレッドを使用しています。 スレッドメソッド内にループがありません。私はStreamReader.ReadToEnd()メソッドを使用していますので、 私のスレッドが何か大きなものをダウンロードしているときにこのスレッドを停止したいです。好ましくはThread.Abort()メソッドなし。 GCスレッドにきれいにするか、これを終了することは可能ですか?C#のスレッドを瞬時に削除する方法

答えて

12

ReadToEndを実行しないで、一度にループを作成してX文字を読み込みます(または、一度に1行ずつReadLineで読み込みます)。ループ内でAutoResetEventが(.WaitOne(0)を使用して)設定されているかどうかを確認し、ループが終了する場合。

ダウンロードを停止するときに、他のスレッドでリセットイベント(Setを使用)を設定します。

+0

+1場合CancellationTokenにし、ループチェックに合格するための.Net 4 Taskクラスを使用することができます。終わりまでの読み込みは本当に悪いです。ノーアボートを忘れてしまいます。そうでなければ、起動に割り当てることができない多くのメモリを使用する可能性があります(64または128kバッファで十分かもしれません)。 – TomTom

+1

StreamReaderでは、Xバイトは読み取られません。その考えをReadLine()に置き換えます。 –

2

BaseStream BeginRead()asyncメソッドを使用できます。独自の専用スレッド(1MBのコミットされたメモリを消費する)を生成するのではなく、これを使用する方がよいでしょう。非同期メソッドは、I/O完了ポートを使用する方が効率的です。

new StreamReader(aStream).BaseStream.BeginRead() 

はここにいくつかの詳細情報http://msdn.microsoft.com/en-us/library/system.io.stream.beginread.aspx

非同期読み込みを停止に関連するスレッドです。

Stop Stream.BeginRead()

0

何ジョージ・ダケット氏は述べていますが、スレッド/非同期タスクを開始し、IsCancellationRequested =真

関連する問題