阻止其他线程在当前线程执行时执行语句块

时间:2015-12-22 09:58:26

标签: c# multithreading sockets

我想阻止所有其他线程执行,直到SendReceive(Socket, strXmlFormat)函数完成执行,因为它用于通过套接字发送数据并手动关闭连接。根据数据发送到服务器的要求,在通过简单地向服务器发送标志手动关闭连接之前,不必向其发送其他数据。所以我想要的是运行该进程的所有其他线程应该停止,直到这段代码完成执行。

process(int start, int end)
{
   // Block other threads from executing while the current thread executes this code block
   Socket = Connect(strSMSIP, strSMSPort);
   SendReceive(Socket, strXmlFormat);
  // undo blocking the threads  
}

这是创建线程并将进程分配给它的方式:

for (int i = 0; i < 5; i++)
{
   int start = i+10
   int end=start+10;

    new Thread(delegate()
    {
        Process(start, end);
    }).Start();
 }

1 个答案:

答案 0 :(得分:1)

您正在寻找lock声明

  

lock关键字确保一个线程不进入代码的关键部分,而另一个线程处于临界区。如果另一个线程试图输入一个锁定的代码,它将等待,阻塞,直到该对象被释放。

private object _lockObject = new object();
public void Process(int start, int end)
{
    lock (_lockObject)
    {
        Socket = Connect(strSMSIP, strSMSPort);
        SendReceive(Socket, strXmlFormat);
    }
}

请注意,它只会同步一个进程的线程。

如果您的客户可以在一台计算机上运行多个进程,则可以使用名为mutex

  

命名系统互斥锁在整个操作系统中都是可见的,可用于同步进程的活动。您可以使用接受名称的构造函数创建表示命名系统互斥锁的Mutex对象。

private Mutex mutex = new Mutex(false, "Name");
public void Process(int start, int end)
{
    try
    {
        mutex.WaitOne();
        Socket = Connect(strSMSIP, strSMSPort);
        SendReceive(Socket, strXmlFormat);
    }
    finally
    {
        mutex.ReleaseMutex();
    }
}