排队服务电话

时间:2012-03-26 12:43:36

标签: c# wcf silverlight queue

我正在实施一个大量使用WCF服务的Silverlight应用程序,我现在已经到了这一点,偶尔会有几个长服务调用阻止其他服务调用运行。

这些服务电话最终会超时。我想知道它是否可能一个接一个地执行服务调用的队列系统,这样长时间的调用会阻止其他调用,但不会导致它们超时。

我正在使用服务代理来打包服务电话

public interface IExampleServiceAgent
{
    void ProcessData(int a, string b, EventHandler<ProcessDataCompletedEventArgs> callback);
}


Public ExampleServiceAgent1 : IExampleServiceAgent
{
     ExampleClient _Client = new ExampleClient();

     public void ProcessData(int anInt, string aString, EventHandler<ProcessDataCompletedEventArgs> callback)
     {
           EventHandler<ProcessDataCompletedEventArgs> wrapper = null;
           wrapper = (a,b) =>
           {
               callback(a,b);
               _Client.ProcessDataCompleted -= wrapper;
           }
           _Client.ProcessDataCompleted += wrapper;
           _Client.ProcessDataAsync(anInt,aString);
     }
}

然后将从代码中调用上述服务代理,如下所示:

ServiceAgent.ProcessData(1,"STRING", (a,b) =>
{
    if (b.Error != null)
    {
         //Handle Error
    }
    else
    { 
         //DO something with the data
    }
}

有没有办法可以将这些服务调用放入队列并逐个执行?

我尝试将它们包装为Actions并将它们添加到队列中,但这并不等待一个人在启动下一个之前完成执行,尽管他们确实正确地调用了服务,但没有数据返回到调用视图模型。

1 个答案:

答案 0 :(得分:3)

WCF服务可以处理大量的呼叫,但为了避免拒绝服务攻击,默认情况下可以处理的请求数量有限。

Silverlight WCF服务的重大限制是

  • 来自同一IP地址的默认限制为2个同时呼叫。
  • 大约10-16个并发连接的限制(文档因此而异)。

关于Quick Ways to Boost Performance and Scalability of ASP.NET, WCF and Desktop Clients的CodeProject文章很有用。

我猜你正在立刻遇到第一个问题。在您的WCF配置中,您需要添加以下内容以增加单个IP连接:

<system.net> 
  <connectionManagement> 
    <add address="*" maxconnection="100" /> 
  </connectionManagement> 
</system.net>

然后,您可以达到解决方案调整web / app.config文件中服务行为的第二个限制。

以下是我自己解决这些问题时发现的一些参考资料: