2015-12-22 38 views
0

我想阻止所有其他线程执行,直到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(); 
} 
+0

'每当数据被发送到服务器的要求,没有其他的数据必须被发送给它until',这将是很难在多个客户机的存在来实现的,甚至可能是在多个分布式机器。一个简单的'锁'或者甚至整个机器'Mutex'都无济于事。如果有的话,您最好在服务器上强制执行此要求。 –

+0

@ Christian.K这个过程只能在一台机器上运行。 –

+0

好的,那么如果这个过程只有一个单一的实例,比看看@Jakub Lortz的答案。否则,请查看['Mutex'](https://msdn.microsoft.com/library/system.threading.mutex(v = vs.110).aspx)类来同步多个进程。 –

回答

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

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

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(); 
    } 
} 
+0

它的一个exe文件只能由一个服务器上的调度程序运行,但如果多个线程正在执行相同的进程,解决方案将工作吗?看到由于某些原因,在写入代码后我无法测试代码,所以我必须盲目信任您的解决方案。 –

+0

@psyLogic在这种情况下,您可能会同时使用两种解决方案 - 使用已命名的互斥锁来确保一次只运行一个应用程序实例,并使用'lock'来同步线程。 –

+0

好的,谢谢!经过一段时间后,我会在正确的答案上标出答案,以便我对此稍有支持。 –

相关问题