1

我很难试图让我的任务保持持久性并从WCF服务无限期地运行。我可能会这样做是错误的,并愿意提出建议。任务持久性C#

我有一个任务开始处理任何传入的请求被放入一个BlockingCollection。据我所知,GetConsumingEnumerable()方法应该允许我在数据到达时持久地提取数据。它本身没有问题。我能够处理数十个请求,没有一个错误或缺陷使用Windows窗体来填写请求并提交它们。一旦我对这个过程充满信心,我通过一个asmx web服务将它连接到我的站点,并使用jQuery ajax调用来提交请求。

网站根据提交的网址提交请求,网络服务从网址下载html内容并在内容中查找其他网址。然后继续为它找到的每个url创建一个请求,并将其提交给BlockingCollection。在WCF服务中,如果应用程序是Online的(即Task已经启动) - 它通过一个Parallel.ForEach使用GetConsumingEnumerable来提取请求,并处理请求。

这适用于前几个提交,但随后任务意外停止。当然,这比我在测试中可以模拟的要多10倍,但我希望它能够节流。我认为这个问题是在我的方法是启动任务:

public void Start() 
     { 
      Online = true; 

      Task.Factory.StartNew(() => 
      { 
       tokenSource = new CancellationTokenSource(); 
       CancellationToken token = tokenSource.Token; 
       ParallelOptions options = new ParallelOptions(); 
       options.MaxDegreeOfParallelism = 20; 
       options.CancellationToken = token; 

       try 
       { 
        Parallel.ForEach(FixedWidthQueue.GetConsumingEnumerable(token), options, (request) => 
        { 
         Process(request); 
         options.CancellationToken.ThrowIfCancellationRequested(); 

        }); 
       } 
       catch (OperationCanceledException e) 
       { 
        Console.WriteLine(e.Message); 
        return; 
       } 

      }, TaskCreationOptions.LongRunning); 

     } 

我已经想过这个移动到WF4服务和刚丝它的工作流程和工作流使用的持久性,但我不愿意学习WF4除非必要。请让我知道是否需要更多信息。

+0

http://stackoverflow.com/questions/6608042/parallel-foreach-loop-with-blockingcollection-getconsumableenumerable – hatchet

+0

可能出现的问题您可能会使用Parallel.ForEaach和GetConsumingEnumerable(BlockingCollection),如此处所述: http://blogs.msdn.com/b/pfxteam/archive/2010/04/06/9990420.aspx – hatchet

回答

1

您显示的代码本身是正确的。

然而,有几件事情可能出错:

  • 如果发生异常,你的任务将停止(当然)。尝试添加try-catch并记录异常。
  • 如果您在托管环境(ASP.NET,WCF,SQL Server)中启动工作线程,主机可以任意决定(无理由)关闭任何工作进程。例如,如果您的ASP.NET网站在一段时间内处于非活动状态,则该应用程序将被关闭。我刚刚提到的主机没有使自定义线程运行。很可能,使用专用应用程序(.exe)或者甚至是Windows服务,您将会获得更大的成功。
+0

我以前抛出一个捕获只是重新启动系统 - 这似乎没有工作,所以我删除它。从你的说法来看,ASP.NET可能是罪魁祸首。我确实设置了这样的工作人员不会超时,并且我将WCF移到与Web Service(asmx)不同的AppPool中,希望能够避免任何冲突。我想我有很多学习要做。我试图通过net.tcp托管服务,但无法获得端点公开。它在视觉stuidos中运行良好 - 但作为Windows服务安装时,会显示连接被拒绝的错误。 –

+0

当你在托管过程中启动线程时,主机将积极地对付你。这听起来像你正在建立一个网络爬虫。我将爬行器放在长时间运行的Windows服务中,并且将该服务与正在向Windows服务发送命令的正常WCF服务或asp.net网站进行通信。你正在避免所有的问题。 – usr

+0

我最终将WCF服务主机移动到Window Service中,认为这可能会解决问题 - 但是相同的症状。我可以添加没有问题的集合,但是如果在向集合提交附加数据时它正在枚举任务中的阻塞集合 - 它会导致服务崩溃。在视觉工作室这不会发生。当我使用Windows窗体作为客户端并在进程运行时提交请求时,它也不会发生。它只在我开始通过asmx提交请求(添加到集合)时才开始出现。 –

0

事实证明,这个问题的原因是WCF绑定配置。该任务突然停止,因为WCF由于打开超时而终止了连接。打开超时设置是请求等待服务在超时之前打开连接的时间。在某些情况下,它达到了10个最大连接的限制,并导致连接未完成的连接等待连接。在交易完成后,我确保我关闭了与主机的所有连接 - 所以我放弃了最大连接和打开超时时间。之后 - 它完美无瑕地运行。