タスクを永続的に保持し、WCF サービスから無期限に実行するのに苦労しています。私はこれを間違った方法で行っている可能性があり、提案を喜んで受け入れます。
BlockingCollection にドロップされた着信要求の処理を開始するタスクがあります。私が理解していることから、 GetConsumingEnumerable() メソッドを使用すると、データが到着したときに永続的にプルできるはずです。それ自体は問題なく動作します。Windowsフォームを使用してリクエストに記入し、送信することで、エラーや欠陥を1つも発生させることなく、数十のリクエストを処理することができました. このプロセスに自信が持てたら、asmx Web サービスを介して自分のサイトに接続し、jQuery ajax 呼び出しを使用してリクエストを送信しました。
サイトは送信された URL に基づいてリクエストを送信し、Web サービスは URL から html コンテンツをダウンロードし、コンテンツ内の他の URL を探します。次に、見つかった URL ごとにリクエストを作成し、BlockingCollection に送信します。WCF サービス内で、アプリケーションがオンラインの場合 (つまり、タスクが開始された場合)、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 を学習するつもりはありません。さらに情報が必要な場合はお知らせください。