2012-02-08 2 views
0

Я пытаюсь запустить метод в результате асинхронной операции чтения в 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)); 
     } 
    } 
} 

Фактический метод, который должен вызвать диспетчер, никогда не вызывается. Теперь из того, что я смог найти в Интернете, заключается в том, что он может иметь какое-то отношение к диспетчеру, который не создается в правильном потоке, и поэтому он никогда не вызывает метод в правильном потоке. Однако диспетчер создается на моей теме, поэтому это не должно применяться.

+0

Попробуйте использовать Invoke вместо BeginInvoke. Сообщите, что произойдет. – Zenexer

+0

Тот же эффект, он не вызывается. – ThaMe90

+0

Вы уверены, что ваш исходный поток, который создает экземпляр вашего класса и 'private Dispatcher dispatcher = Dispatcher.CurrentDispatcher;', все еще активен в этот момент? –

ответ

0

Как попытка исправить это, я явно получил Dispatcher из моего UI-Thread и передал его в нужное место, которое я хотел использовать. Это вместо того, чтобы пытаться получить его с помощью Dispatcher.CurrentDispatcher. И что вы знаете, это сработало. Делегат теперь называется правильно.

По-видимому Dispatcher.CurrentDispatcher не получил правильное значение Dispatcher Я хотел его использовать.

+0

Dispatcher.CurrentDispatcher принимает диспетчера из текущего потока. В каждом процессе нет ни одного диспетчера. – usr

+0

Я знаю это, но поскольку объект, который назывался Dispatcher.CurrentDispatcher, был создан на основном UI-Thread, я думал, что это будет нормально его использовать. Наверное, я ошибся. – ThaMe90

Смежные вопросы