假设您有一个客户端和服务器通过某种消息总线进行通信,该消息总线具有以下接口:
interface IBus {
void Send(Message m);
void Receive(Message m);
}
Message
是这样的POCO:
class Message {
public Guid Id {get;set;}
public string Data {get;set;}
}
因此,您可以通过Send
发送消息,并且当响应到达时,消息传递基础结构将调用Receive
方法,该方法本质上只是一个回调。我现在想做的是编写一个方法,让我等待响应
Message WaitForResponse(Message request);
并像这样使用它:
var response = WaitForResponse(request);
Console.Write(response.Data);
我尝试使用TaskCompletionSource
并很好用,但是它需要async\await
,并且我已经用这种同步样式编写了很多代码。这段代码现在使用ManulResetEventSlim
中存储的ConcurrentDictionary
个对象进行同步,但是当等待响应的请求数量增加到数百个时,它会遇到性能问题(我想是因为所有线程都被{ {1}})。我想应该有一个更好的方法来做到这一点,该方法只需要更改manualResetEventSlim.Wait()
的实现,并保持所有方法签名不变