2012-05-19 45 views
2

好的,這是一個非常奇怪的問題,但情況是這樣的。我有一個我一直在研究的通信庫,它的許多特性之一是一個後臺線程,它接受來自套接字的所有傳入數據包並根據需要進行分配。用最簡單的形式,你可以有一個請求或一個請求的響應。多線程可以通過發送請求,使用此庫在同一個套接字上發送,然後在響應到達後等待來自後臺線程的信號(事件)。只有從某個特定的線程調用它才能使某些事情發生。

您可以定義與後臺線程關聯的委託來處理傳入請求發生的情況。簡而言之,您可以嘗試從此代理髮送請求。由於這與所有後臺接收線程都在同一線程中,因此它會死鎖(線程會阻塞,等待其響應,永遠不會發生)。這些是我和大多數人都知道要避免的情況,但我很想有辦法拋出異常,或者可能有編譯時檢查,以防止程序員嘗試調用某個方法,即發送請求的方法,來自處理接收的線程。

+0

似乎每響應處理程序將阻止對後臺線程的所有請求?爲什麼不在單獨的線程中處理響應?只是好奇... – 6opuc

+0

@ 6opuc因爲它是一個庫,我想在同一個線程上做所有的選擇。像服務器這樣的服務器只響應請求,但從來沒有做任何自己的事情不需要有第二個線程,因爲它只是浪費資源。這個想法應該是程序員應該有一個單獨的線程來處理所有的請求,但是如果我或者其他人使用庫意外地嘗試發送他們自己的請求作爲響應的一部分,我寧願有一個異常而不是死鎖。這是一個不會出現的情況,如果圖書館使用正確 – cost

回答

2

可以命名你的線程

Thread.CurrentThread.Name = "Any name you like"; 

或者你可以在你的方法創建一個靜態字段來保存你的線程ID

SomeClass.RequestSenderThreadId = Thread.CurrentThread.ManagedThreadId; 

然後

if(SomeClass.RequestSenderThreadId == Thread.CurrentThread.ManagedThreadId) 
{ 
    throw new OperationException("You cant use this method in this thread"); 
} 
+0

我喜歡這個想法,謝謝,並且示例代碼真的有幫助 – cost

相關問題