如何在锁定端口时切换线程?

时间:2010-07-29 07:35:43

标签: c# ports

static SerialPort port = new SerialPort("COM3", 57600, Parity.None, 8, StopBits.One);
thread1()
{

   lock(port)
   for(;;)
      port.write"Hi 1";
}
thread2()
{
   lock(port)
   for(;;)
      port.write"Hi 2"
}

输出:(在超级终端中)

Hi 1
Hi 1
Hi 1

这里因为thread1被锁定并且处于无限循环中,所以它根本不会出现在thread1中..但我需要thread1和thread2同时打印..请帮帮我。

感谢。

1 个答案:

答案 0 :(得分:2)

如果他们使用相同的端口,他们无法同时打印 ...但可能意味着:

void Thread1()
{    
   for(;;)
   {
      lock (port)
      {
          port.Write("Hi 1");
      }
   }
}

void Thread2()
{    
   for(;;)
   {
      lock (port)
      {
          port.Write("Hi 2");
      }
   }
}

这里我们只在写入期间获取锁定 - 所以在我们发布它之后,有另一个线程可以进入并获取锁定。

但有两点:

  • 我不想保证这里会发生什么。我不会惊讶地看到一个线程仍然写了很长时间,因为它可能会在另一个线程获得时间片之前重新获取锁。它取决于调度程序和您拥有的核心数。
  • 一般来说,为了锁定,我更喜欢锁定仅为 创建的监视器。您不知道SerialPort中的其他代码可能会锁定其监视器。