秒表线程安全吗?

本文关键字:安全 线程 | 更新日期: 2023-09-27 18:14:12

我的代码中有一部分:

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

任何想法?

谢谢!

秒表线程安全吗?

From MSDN:

线程安全

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

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

现在我认为有一个问题与你的inputBuffer,为什么因为它不是线程本地。如果多个线程试图同时使用它,就会导致不一致。你可以试试流媒体。同步或实现自己的线程安全流类。

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