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個最大連接的限制,並導致連接未完成的連接等待連接。在交易完成後,我確保我關閉了與主機的所有連接 - 所以我放棄了最大連接和打開超時時間。之後 - 它完美無瑕地運行。