Я пытаюсь запустить метод в результате асинхронной операции чтения в NetworkStream. Операция чтения выполняется через BeginRead и EndRead, в результате чего EndRead вызывается в обратном вызове, указанном в BeginRead. Все довольно простые вещи. Теперь, когда обратный вызов выполняется в потоке, созданном системой, данные, считанные из 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);
}
Где socket - это объект TcpClient.
Метод disptached выглядит следующим образом: Это просто передает данные через событие для дальнейшей обработки.
private void RaiseReceived(IPEndPoint sender, byte[] data)
{
if(IsEnabled){
if (Received != null)
{
Received(this, new TCPDataArgs(sender, data));
}
}
}
Фактический метод, который должен вызывать диспетчер, никогда не вызывается. Теперь из того, что я смог найти в сети, является то, что это может иметь отношение к тому, что диспетчер не создается в правильном потоке, и поэтому он никогда не вызывает метод в правильном потоке. Тем не менее, диспетчер создан в моей теме, поэтому это не должно применяться.