2015-03-24 3 views
0

Я пытаюсь обернуть как отправку, так и получение данных на сервер с использованием шаблона async/await. То, что я создал, представляет собой среду сокетов, управляемую событиями, которая запускает события всякий раз, когда данные принимаются с сервера. Тем не менее, у меня возникли проблемы с попыткой выяснить, как ждать потока после отправки, чтобы я не возвращался до тех пор, пока данные с сервера не вернутся.Async/Await Отправка и получение данных сети

В прошлом я использовал ручное событие сброса для достижения этой цели ...

byte[] returnData; 

public byte[] SendData(byte[] data){ 
    socket.Send(data, 0, data.Length); 
    manualResetEvent.Wait(); 
    return returnData; 
} 

public void OnDataReceived(byte[] serverData){ 
    returnData = serverData; 
    manualResetEvent.Set(); 
} 

Этого метод просто останавливает поток абонента, пока событие сброса не срабатывают. Это нехорошо, так как я хочу шаблон async/await, чтобы вызывающий поток мог выполнять другую работу, ожидая данных с сервера.

То, что я сейчас ....

byte[] returnData; 

public async Task<byte[]> SendData(byte[] data){ 
    await socket.SendAsync(data, 0, data.Length); 
    //await something that frees up this thread to do other work 
    return returnData; 
} 

public void OnDataReceived(byte[] serverData){ 
    returnData = serverData; 
    //do something that pushes SendData back into the active context 
} 

Я думаю, что я делаю неправильно somethign. Любая помощь будет оценена!

+0

Где код, который вызывает событие, которое обрабатывается 'OnDataReceived'? –

ответ

-1

Я нашел подходящее решение.

Вместо использования ManualResetEvent, я могу использовать так называемый TaskCompletionSource<T>. Это дает мне функциональность, необходимую мне, чтобы пул потоков мог ожидать некоторого изменения состояния.

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