我很難試圖讓我的任務保持持久性並從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除非必要。請讓我知道是否需要更多信息。
http://stackoverflow.com/questions/6608042/parallel-foreach-loop-with-blockingcollection-getconsumableenumerable – hatchet
可能出現的問題您可能會使用Parallel.ForEaach和GetConsumingEnumerable(BlockingCollection),如此處所述: http://blogs.msdn.com/b/pfxteam/archive/2010/04/06/9990420.aspx – hatchet