【问题标题】:WCF prevent concurrent background tasksWCF 防止并发后台任务
【发布时间】:2015-01-27 01:38:08
【问题描述】:

我正在开发一个设置如下的 WCF Web 服务:

  1. 由来自任务调度程序的 REST 请求定期触发(每 15 分钟一次)的 Web 方法。

  2. 当被触发时,Web 方法使用 Task.Factory.StartNew 启动一个后台方法。此方法涉及从远程 API 获取和发布以及写入本地数据库,有时需要几分钟才能完成。

  3. 一旦后台方法启动,Web 方法就会返回“成功触发”消息并终止。

我的问题是:如果 web 方法在运行时再次触发,后台方法是否能够在多个线程上同时运行?我不希望这种情况发生,因为它可能会导致各种麻烦。理想情况下,我希望多个调用排队并在单个后台线程上一个接一个地执行。

我也不确定 Task.Factory.StartNew 是否是最好的方法,如果有任何建议,我将不胜感激。

【问题讨论】:

    标签: c# multithreading wcf concurrency


    【解决方案1】:

    您可以使用TaskFactory.StartNew,如果您使用正确类型的TaskScheduler 创建TaskFactory...

    我建议使用 Parallel Extensions Extras nuget package 并使用 OrderedTaskScheduler 运行您的任务:

    System.Threading.Tasks.Schedulers.OrderedTaskScheduler sch = new OrderedTaskScheduler();
    
    //you could persist this as static or in the kernel of your favorite DI framework    
    var taskFactory = new TaskFactory(sch); 
    
    for(var i = 0; i < 10; ++i)
    {
        var x = i;
        //these Console operations will occur in order
        taskFactory.StartNew(() => Console.WriteLine(x));
        //but if we did as below, order would be lost
        //Task.Factory.StartNew(() => Console.WriteLine(x));
    }
    

    因此,您可以看到,它按照添加顺序在单个线程中运行这些操作。

    【讨论】:

      【解决方案2】:

      如果您想将 WCF 服务本身限制为一次只执行一个线程(即对服务的并发调用将阻塞并一次执行一个),请考虑使用您可以附加到的 ServiceBehaviorAttribute 的以下属性您的服务实现。

      InstanceContextMode = InstanceContextMode.Single

      https://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.instancecontextmode(v=vs.110).aspx

      ConcurrencyMode = ConcurrencyMode.Single

      https://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.concurrencymode(v=vs.110).aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-09
        • 2020-05-13
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        • 2014-12-22
        • 1970-01-01
        相关资源
        最近更新 更多