来自单独线程的WCF响应

时间:2014-03-31 15:29:36

标签: c# wcf

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;
    }
    
  5. 现在,在每个人开始烧烤我之前,我太明白这是不好的做法,这就是为什么我在这里问这个问题,希望能有更好的方法来做到这一点。我意识到目前的代码我有以下问题:

    我的while循环可能在一个continue循环中,因此如果它之间没有sleep()就会占用CPU。 由于异步调用的性质,我的响应队列可能包含错误的响应。

    所以我有两个问题:

    1. 有没有办法在while循环中放入睡眠以消除高CPU使用率?
    2. 有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

首先这样做是没有意义的。而不是让当前线程在等待另一个队列计算工作时无所事事(同时吃掉大量CPU周期),只计算当前线程中的响应并将其发回。通过将其排队等待处理另一个线程,你什么也得不到。

您还使用无法从多个线程安全访问的队列对象,因此除了极其效率低之外,它还受到竞争条件的影响,这可能意味着它甚至无法工作。 / p>