秒表是否是线程安全的?

时间:2015-09-24 04:32:59

标签: c# .net multithreading thread-safety stopwatch

我的代码中有一部分:

private void Wait(String expectedResponse)
{
    waitTimeout = 30;
    Stopwatch sw = new Stopwatch();
    sw.Start();
    while (!inputBuffer.Contains(expectedResponse))
    {
        if (sw.Elapsed.Seconds < waitTimeout)
        {
            Thread.Sleep(1);
        }
        else
        {
            sw.Stop();
            throw new Exception("Timeout");
        }
    }
    sw.Stop();
    Console.WriteLine("SUCCESS");
}

Wait方法在主线程中运行,有时在创建主线程的线程中运行。

有时程序的方法无限循环,虽然时间(30秒)已经过去,但是没有生成异常。

那么,问题是什么? StopWatch类不是线程安全的吗?如果是这样,如何重写代码?

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

来自MSDN

  

线程安全

     

此类型的任何公共静态成员都是线程安全的。任何实例   成员不保证是线程安全的。

此外,我还没有在您的代码中看到任何线程敏感的调用/方法。您正在实例化线程本地Stopwatch并使用它。顺便说一句,Thread.Sleep(1)将尝试阻塞1ms(但这是特定于操作系统的,窗口将阻塞约15ms)并且仍然没有关于线程的问题。

现在我认为您的inputBuffer存在问题,为什么因为它不是线程本地的。如果多个线程同时尝试使用它,则会导致不一致。您可以尝试Stream.Synchronized或实现自己的线程安全流类。

我还建议您使用逐步调试或使用至少一些断点来了解正在发生的事情。