Thread.Sleep()
メソッドを使用するのが良いか悪いのかについて多くの話があります。私が理解しているところでは、主にデバッグの目的で使用されます。Thread.Sleep()をスレッドを一時停止するのに使用するとパフォーマンスが悪くなるでしょうか?
今私は疑問に思っています。スレッドを一時停止/再開できるように常にループしているというのは、私の特定の目的に使用するのが悪いですか?これは、I/O操作を実行するスレッドを一時停止し、簡単な方法で再開できるためです。
I/O操作は、基本的に、すべてのデータが書き込まれるまで、ファイルに4096バイトのブロックを書き込むだけです。ファイルが大きく、時間がかかることがあるので、私は操作を一時停止できるようにしたい(多くのシステムリソースを食べ始める場合に備えて)。
私のコード、VB.NET版:
'Class level.
Private BytesWritten As Long = 0
Private Pause As Boolean = False
'Method (thread) level.
While BytesWritten < [target file size]
...write 4096 byte buffer to file...
While Pause = True
Thread.Sleep(250)
End While
...do some more stuff...
End While
C#の同等:
//Class level.
long bytesWritten = 0;
bool pause = false;
//Method (thread) level.
while(bytesWritten < [target file size]) {
...write 4096 byte buffer to file...
while(pause == true) {
Thread.Sleep(250);
}
...do some more stuff...
}
私はResetEventsについて聞いていると私は、彼らが何をすべきかについて少し知っているが、私は本当に決してありません彼らに多く見られました。
私はマニュアルリセットイベントを使用します。各チャンクの後、イベントを待ちます。スレッドを一時停止するには、イベントをリセットします。スレッドを再開するには、イベントを設定します。 –
* a * long *操作を一時停止したいと思う理由はわかりません。確かにそれはちょうどそれが長くかかるようになります。ファイルを非同期で書きたい場合は、非同期ファイルIOを使用して結果を待つのはなぜですか? –
@EricLippert:これは、操作が多くのシステムリソースを消費する可能性があるため、アプリケーションのユーザーが一時停止したい場合に使用します。 –