秒表是线程安全的吗?

Is the stopwatch thread-safe?

我的代码有一部分:

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 class 不是线程安全的?如果是这样,如何重写代码?

有什么想法吗?

谢谢!

来自MSDN

Thread Safety

Any public static members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

此外,我在您的代码中没有看到任何线程敏感 call/method。您正在实例化线程局部 Stopwatch 并使用它。顺便说一句,Thread.Sleep(1) 将尝试阻塞 1 毫秒(但这是 OS 特定的,windows 将阻塞约 15 毫秒)并且线程仍然没有问题。

现在我认为您的 inputBuffer 有问题,因为它不是线程本地的。如果不止一个线程试图同时使用它,那将导致不一致。您可以尝试 Stream.Synchronized 或实现您自己的线程安全流 class.

我还建议您使用逐步调试或至少使用一些断点来了解发生了什么。