繁体   English   中英

秒表是线程安全的吗?

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

有任何想法吗?

谢谢!

MSDN

线程安全

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM