2015-12-22 66 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

好的,謝謝!經過一段時間後,我會在正確的答案上標出答案,以便我對此稍有支持。 –

相關問題