2011-08-31 95 views
1

我有一個方法,偵聽通過流發送的數據。因爲networkstream.read方法是同步的,我必須在單獨的線程上執行它。所以,我在一個單獨的線程中執行的方法是:停止線程不工作

void someMethod(param1, param2....) 
{ 
    try{ 
    while(stream.read(data...) != 0) // code waits here until data is received 
    { 
     // do stufff 

    } 
    }catch{}// 
} 

我可以退出該線程的唯一途徑是通過關閉流和catch塊將被執行。我有時需要開始監聽同一個數據流上的數據,但採用不同的方法。所以如果我創建線程爲線程t = new線程(new threadstart(somemethod ......)然後做t.start(someObject);稍後當我做t.abort()時;該方法仍然會監聽。數據我怎樣才能終止它

也是我試圖創建一個全局變量,如:

bool someBoolean = false; 

void someMethod(param1, param2....) 
{ 
    try{ 
    while(someBoolean ==false && stream.read(data...) != 0) // code waits here until data is received 
    { 
     // do stufff 

    } 
    }catch{}// 
} 

然後我計算過,我改變someBoolean爲true的方法將停止執行出於某種原因它。不是,爲什麼?似乎someBoolean是兩個變量,因爲從主線程中改變它的值似乎不會影響它的第二個線程...

+0

您應該以緩衝的方式從流中讀取數據,意味着讀取少量數據。顯示真實的代碼,你如何做你的閱讀和你的東西,你的線程工作的方式... –

+1

'stream.Read'將阻塞,直到數據可用,所以設置布爾值在這一點上沒有幫助。 – dlev

回答

1

I gu線程可能正在終止,但是來自該線程的資源(因流而不受管理)將不會被釋放 - 這是您的問題。

不要停止與中止線程 - 從來沒有。

是否停止嘗試使用stream.read的異步版本和CancellationToken一起使用。 如果你給我們更多的信息(什麼流?) - 讀是奇怪的(「R」ead?),線程開始)我可能會嘗試給你更多的細節。

PS:嘗試使用System.Threading.Task而不是線程 - 方式更好。

爲速戰速決沒有進一步的信息,你可以嘗試這樣的事:

ManualThreadEvent terminate = new ManualThreadEvent(false); 
bool someBoolean = false; 

void someMethod(param1, param2....) 
{ 
    try{ 
    // wait for enough data or for termination: 
    while(terminate.WaitOne(100) == false && stream.DataAvaiable <= bytesNeeded) 
    { /* nothing to do here */ } 

    if (terminate.WaitOne(0)) return; // terminate on request 

    // To your stuff with read 
    }catch{}// 
} 

void Terminate() 
{ 
    terminate.Set(); 
} 
+0

它將很好地創建stream.read的異步版本。 stream是NetworkStream類型,我在服務器(tcpListener對象)和客戶端之間創建tcp連接時基本上創建它。 –

+0

NetworkStream沒有問題(只需查找BeginRead/EndRead) - 但最好給我們編譯代碼 - 上面這些只是片段,很難給你提供很好的建議。正如我所說的使用異步版本,並考慮切換到任務 - 如果您使用CancellationToken的東西,你應該做的很好。另請注意,您可以使用.DataAvailable您的數據流來檢查數據,然後短時間睡眠(或等待短時間終止信號) – Carsten

1

我怎樣才能終止呢?

解除阻塞流調用的標準協議是關閉流並捕獲異常。中斷一個閱讀,這樣你可以將它移到不同的方法是非常不尋常的。如果你覺得這仍然是必要的,那麼你應該在讀操作中提供額外的間接級別。在使用異步調用(如BeginRead)而不是同步調用時處理類似情況要容易得多。通過Thread.Abort終止線程可能會導致比解決問題更多的問題。

然後我計算過,我改變someBoolean爲true的方法將停止執行 。由於某種原因它沒有。爲什麼?它似乎像一些布爾 是一次兩個變量。因爲從主 線程改變其價值似乎並沒有影響到它的第二個線程上...

這可能是缺乏記憶障礙可能導致此問題,但更可能的原因是線程卡在Read內,實際上並沒有按照您希望的方式讀取someBoolean