2

タスクを持つWindowsサービスがあり、それらのタスクは並列foreachを実行していくつかの画像を処理します。

私が今やらなければならないことは、service onstopメソッドで、タスクがすでに進行中のアイテムの処理を完了できるようにすることですが、新しいアイテムを開始することはできません。

以下は、私が持っているものを示すための私のコードの断片です。

if (recordsToProcess != null && recordsToProcess.Any())
        {
            if (!_cancellationTokenSource.Token.IsCancellationRequested)
            {
                Parallel.ForEach(recordsToProcess, new ParallelOptions { MaxDegreeOfParallelism = MaxParallelThreadSetting }, currentRecord => _Processor.Process(currentRecord, _supportedFileTypes));
            }

            Task.WaitAll(); //Recently added not sure if needed
        }

 protected override void OnStop()
    {
        //Sets the cancel flag to stop the processing
        _cancellationTokenSource.Cancel();
        //Allows existing threads to complete
        _logHandler.LogInfoMessage("Waiting On Cancel");
        Task.WaitAll();

        //Stop service and tidy up resources
        _logHandler.LogInfoMessage("Stopping service");
        base.OnStop();
}

ご覧のとおり、処理する新しいアイテムの追加を停止していますが、すべてが完了する前にサービスが停止しています。

何か案は??

乾杯

4

1 に答える 1

0

新しいレコードの処理を防ぐには、ParallelLoopState.Stopを呼び出す必要があります。詳細については、「方法: Parallel.For ループを停止または中断する」を参照してください。

于 2012-07-19T15:53:52.700 に答える