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