java阻止等待_异步等待另一个请求而不阻塞

我有一个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消息?

每个提示都要提前感谢您

卢卡斯

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值