protected async Task RecvAndProcessMessages(CancellationToken cancel_token)
{
var local_cancel = new CancellationTokenSource();
cancel_token.Register(() => local_cancel.Cancel());
var recv_message_task = Task.Run(async () => {
while (!local_cancel.IsCancellationRequested) {
await RecvMessage(messageQueue, local_cancel.Token);
}
}).ContinueWith(prev => {
local_cancel.Cancel();
});
while (!local_cancel.IsCancellationRequested) {
var msg = await messageQueue.DequeueAsync(local_cancel.Token);
switch (msg.Direction) {
case QueuedMessage.MessageDirection.In:
await ProcessMessage(msg.Message, local_cancel.Token);
FlushBuffer();
break;
case QueuedMessage.MessageDirection.Out:
await SendMessage(msg.ChunkStreamId, msg.Message, local_cancel.Token);
break;
}
}
await recv_message_task;
}