【发布时间】:2014-03-31 15:29:36
【问题描述】:
public interface IEventDismiss
{
[OperationContract]
[return:MessageParameter(Name="response")]
[XmlSerializerFormat]
Response ProcessRequest(Request request);
}
你好,
以上是我在 C# 中的 WCF 实现,它非常简单。但是,当我收到请求并将其传递给另一个线程进行处理以产生响应并最终将响应发送回来时,它变得有点复杂。
我的算法是:
- 获取请求。
- 通过将其放入其他线程的静态队列中,将其传递给单独的线程进行处理。
- 一旦线程完成处理,它会将响应对象放入静态队列。
-
在我的函数 ProcessRequest 中,我有一个 while 循环,该循环将该响应出列并将其发送回请求者。
public Response ProcessRequest (Request request) { bool sWait = true; Response sRes = new Response(); ResponseProcessor.eventIDQueue.Enqueue(request.EventID); while (sWait) { if (ResponseProcessor.repQ.Count > 0) { sRes = ResponseProcessor.repQ.Dequeue(); sWait = false; } } return sRes; }
现在,在大家开始盘问我之前,我也意识到这是一种不好的做法,这就是为什么我在这里提出这个问题,希望能找到更好的方法来做到这一点。我意识到当前代码存在以下问题:
我的 while 循环可能在一个 continue 循环中,因此如果它之间没有 sleep() 会占用 CPU。 由于异步调用的性质,我的响应队列可能包含错误的响应。
所以我有两个问题:
- 有没有办法在 while 循环中设置睡眠以消除高 CPU 使用率?
- 有没有更好的方法来做到这一点?
【问题讨论】:
-
你考虑过使用 Async 和 Await 吗?