3

我想制作一段可重用的代码,线程可以调用它来休眠,直到达到特定时间或被告知取消。Cancel 变量将是具有 Thread 的对象上的 volatile 布尔值。

我的方法是这样的:

public class ThreadUtil
{
    public static void SleepTillOrDone(DateTime till, ref bool done)
    {
        while ((!done) && (DateTime.Now < till))
        {
            var diff = till - DateTime.Now;
            Thread.Sleep(diff.TotalMilliseconds >= 100 ? 100 : 10);
        }
    }
}

但是,这给出了“对 volatile 字段的引用不会被视为 volatile”的警告。在阅读了一下之后,我理解了警告的含义,但是如何编写这样一种在没有 volatile 关键字的情况下可以安全使用的方法呢?还是有不同的和完全更好的方法?

4

1 回答 1

2

在我看来,您正在尝试重新发明现有的原语。在这种情况下,WaitHandles。您的方法看起来很像ManualResetEvent.WaitOne,意图超时。

于 2012-11-07T12:22:06.787 回答