【发布时间】:2016-11-27 12:25:23
【问题描述】:
关于使用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,并且对它们的作用略知一二,但我从未真正深入研究过它们。
【问题讨论】:
-
我会使用手动重置事件。在每个块之后,等待事件。要暂停线程,请重置事件。要恢复线程,请设置事件。
-
我不明白你为什么要暂停一个长时间的操作。当然,这只会使它花费更长的时间。如果您希望文件异步写入,那么为什么不使用异步文件 IO 并等待结果呢?
-
@EricLippert :如果我的应用程序的用户想要暂停它,因为该操作可能会占用大量系统资源。
标签: c# vb.net multithreading blocking thread-sleep