Делегаты, отправленные диспетчером, никогда не увольняются - PullRequest
0 голосов
/ 08 февраля 2012

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

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

1 Ответ

0 голосов
/ 08 февраля 2012

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

Видимо Dispatcher.CurrentDispatcher не получил правильный Dispatcher Я хотел, чтобы он использовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...