【问题标题】:WCF response from separate thread来自单独线程的 WCF 响应
【发布时间】:2014-03-31 15:29:36
【问题描述】:
public interface IEventDismiss
{
    [OperationContract]
    [return:MessageParameter(Name="response")]
    [XmlSerializerFormat]
    Response ProcessRequest(Request request);
}

你好,

以上是我在 C# 中的 WCF 实现,它非常简单。但是,当我收到请求并将其传递给另一个线程进行处理以产生响应并最终将响应发送回来时,它变得有点复杂。

我的算法是:

  1. 获取请求。
  2. 通过将其放入其他线程的静态队列中,将其传递给单独的线程进行处理。
  3. 一旦线程完成处理,它会将响应对象放入静态队列。
  4. 在我的函数 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。 由于异步调用的性质,我的响应队列可能包含错误的响应。

所以我有两个问题:

  1. 有没有办法在 while 循环中设置睡眠以消除高 CPU 使用率?
  2. 有没有更好的方法来做到这一点?

【问题讨论】:

  • 你考虑过使用 Async 和 Await 吗?

标签: c# wcf


【解决方案1】:

首先这样做没有意义。与其让当前线程在等待另一个队列计算工作时无所事事(无论如何都要消耗大量的 CPU 周期),只需计算当前线程中的响应并将其发回.将其排队等待另一个线程处理,您一无所获。

您还使用了无法从多个线程安全访问的队列对象,因此除了极度效率低下之外,它还受制于可能意味着它甚至无法工作的竞争条件。

【讨论】:

  • 不幸的是,我这样做是基于现有的结构,我必须这样做:(
  • @Fylix 为什么你需要这样做?如果您有一个现有的结构,您打算如何更改它以添加对非忙碌等待的支持,因为这几乎肯定会涉及代码中相当重大的结构更改。
猜你喜欢
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多