Я пытаюсь запустить метод в результате асинхронной операции чтения в 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);
}
Где сокет объект TcpClient.
Отсеченный метод выглядит следующим образом: То, что это делает, просто передает данные через событие для дальнейшей обработки.
private void RaiseReceived(IPEndPoint sender, byte[] data)
{
if(IsEnabled){
if (Received != null)
{
Received(this, new TCPDataArgs(sender, data));
}
}
}
Фактический метод, который должен вызвать диспетчер, никогда не вызывается. Теперь из того, что я смог найти в Интернете, заключается в том, что он может иметь какое-то отношение к диспетчеру, который не создается в правильном потоке, и поэтому он никогда не вызывает метод в правильном потоке. Однако диспетчер создается на моей теме, поэтому это не должно применяться.
Попробуйте использовать Invoke вместо BeginInvoke. Сообщите, что произойдет. – Zenexer
Тот же эффект, он не вызывается. – ThaMe90
Вы уверены, что ваш исходный поток, который создает экземпляр вашего класса и 'private Dispatcher dispatcher = Dispatcher.CurrentDispatcher;', все еще активен в этот момент? –