2012-02-08 54 views
0

我想火法的結果上的NetworkStream異步讀取操作。讀操作通過BeginRead和EndRead完成,導致在使用BeginRead指定的回調中調用EndRead。所有非常基本的東西。現在,由於回調是在系統生成的Thread中完成的,因此從NetworkStream讀取的數據不再屬於我的線程,稱爲BeginRead。爲了克服這個問題,我編寫了一個方法來進一步處理數據讀取,我嘗試通過線程的調度程序調用。代表由調度員派遣從未被觸發

// These are created in my Thread 
private delegate void ReceiverCallback(IPEndPoint sender, byte[] data); 
private Dispatcher dispatcher = Dispatcher.CurrentDispatcher; 

隨着回調看起來像這樣:

private void DataReceived(IAsyncResult result) 
{ 
    DataReceivedStruct drs = (DataReceivedStruct)result.AsyncState; 
    NetworkStream used = drs.stream; 
    AutoResetEvent handle = drs.waitHandle; 
    used.EndRead(result); 
    DispatchRaiseReceived(readBuffer); 
    handle.Set(); 
} 

的DataReceivedStruct是一個簡單的結構持有的NetworkStream和的AutoResetEvent。 ReadBuffer是一個全球性的專用字節[1024長度的]爲的BeginRead和EndRead中相同的方法不被調用。

的DispatchRaiseReceive方法是這樣的:

private void DispatchRaiseReceived(byte[] data) 
{ 
    dispatcher.BeginInvoke((ReceiverCallback)RaiseReceived, socket.Client.RemoteEndPoint, data); 
} 

如果插座是的TcpClient對象。

的disptached方法看起來像下面的代碼位。它所做的只是通過事件傳遞數據以進一步處理。

private void RaiseReceived(IPEndPoint sender, byte[] data) 
{ 
    if(IsEnabled){ 
     if (Received != null) 
     { 
      Received(this, new TCPDataArgs(sender, data)); 
     } 
    } 
} 

調度員需要調用的實際方法永遠不會被調用。現在,從我已經能夠在網上找到的,它可能有一些做有沒有在正確的線程創建的調度,因此永遠不會調用在正確的線程的方法。但是,調度程序是在我的線程上創建的,因此不適用。

+0

嘗試使用調用,而不是的BeginInvoke。報告發生了什麼。 – Zenexer 2012-02-08 10:16:19

+0

同樣的效果,它不會被調用。 – ThaMe90 2012-02-08 10:19:18

+0

您確定您的原始線程,即實例化您的類和'Private Dispatcher dispatcher = Dispatcher.CurrentDispatcher;'的那個線程在此時仍處於活動狀態嗎? – 2012-02-08 10:29:19

回答

0

爲了解決這個問題,我明確地從我的UI-Thread中獲得了Dispatcher,並將它傳遞給我想要使用它的所需位置。這不是試圖用Dispatcher.CurrentDispatcher來得到它。你知道什麼,它的工作。該委託現在被正確調用。

顯然Dispatcher.CurrentDispatcher沒有得到正確的Dispatcher我希望它用。

+0

Dispatcher.CurrentDispatcher從當前線程獲取調度程序。每個進程沒有一個調度程序。 – usr 2012-02-08 12:26:39

+0

我知道,但作爲調用Dispatcher.CurrentDispatcher的對象是在主UI線程上創建的,我認爲可以使用它。我想我錯了。 – ThaMe90 2012-02-08 12:57:28