我很难试图让我的任务保持持久性并从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