我想火法的結果上的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));
}
}
}
調度員需要調用的實際方法永遠不會被調用。現在,從我已經能夠在網上找到的,它可能有一些做有沒有在正確的線程創建的調度,因此永遠不會調用在正確的線程的方法。但是,調度程序是在我的線程上創建的,因此不適用。
嘗試使用調用,而不是的BeginInvoke。報告發生了什麼。 – Zenexer 2012-02-08 10:16:19
同樣的效果,它不會被調用。 – ThaMe90 2012-02-08 10:19:18
您確定您的原始線程,即實例化您的類和'Private Dispatcher dispatcher = Dispatcher.CurrentDispatcher;'的那個線程在此時仍處於活動狀態嗎? – 2012-02-08 10:29:19