我有一个websocket应用程序,它是一个OWIN中间件 . 当请求进入时,会启动websocket处理程序的新实例,然后在循环中等待icoming消息,如下所示:
var buffer = new byte[1024*64];
Tuple, WebSocketMessageType> received;
do
{
received = await _webSocket.ReceiveMessage(buffer, _cancellationToken.Token);
if (received.Item1.Count > 0 && someConditionForCallingDoSomething)
{
await DoSomething(received.Item1);
}
else if(isAnswer)
{
QueueAnswer(received.Item1);
}
} while (received.Item2 != WebSocketMessageType.Close);
当数据可用时,从 _webSocket.ReceiveMessage 返回的任务将完成 .
DoSomething 处理其数据,然后通过websocket连接发送内容 . 然后它应该通过websocket连接等待消息 . 处理完此消息后,它应该做一些工作并返回(任务) . 也许这个小图解释了它更容易:
_______________
| DoSomething |
|-------------|
| Work ---------> Send WS message
| |
| ?? |
| |
| More Work
| | |
| V |
| return; |
|_____________|
Do some work with the data
|
V
Send a message
|
V
Wait for an answer
|
V
Process answer
|
V
finish
我试图等待答案:
var answerCancel = new CancellationTokenSource();
answerCancel.CancelAfter(30 * 1000);
var answer = await Task.Run(async () =>
{
string tmpAnswer = null;
while (!_concurrentAnswerDict.TryGetValue(someKey, out tmpAnswer)) {
await Task.Delay(150, answerCancel.Token);
}
return tmpAnswer;
}, answerCancel.Token);
但这似乎阻止,直到任务被取消 . 当我调试程序时,我在30秒后看到 QueueAnswer 的调用 . 我想, Task.Run 将在一个新线程中运行该函数,但它似乎没有 . 从 Task.Run 阻塞的角度来看,我认为它不起作用是合乎逻辑的,因为我等待执行 DoSomething ,因此接收新消息也将被阻止 .
我的问题是:我如何实现这样的行为?在完成之前,如何使 DoSomething 等待另一个websocket消息?
每个提示都要提前感谢您
卢卡斯