检查 Parallel.Foreach 内的线程所花费的时间,如果花费更多时间则退出

Check time taken by a thread inside Parallel.Foreach and exit if it is taking more time

我有 Parallel.Foreach 的代码,它正在处理文件并对每个文件并行执行一些操作。

Parallel.ForEach(lstFiles, file=>
{
 // Doing some operation on file
 // Skip file and move to next if it is taking too long
});

我想跳过一个文件并移至下一个文件(但不想退出 Parallel.Foreach) 如果特定文件花费的时间太长 (说2分钟)。 Parallel.Foreach 中是否有任何方法可以检查线程处理单个文件所花费的时间。

谢谢

我建议你不要使用 Parallel.ForEach 而是使用 Mirosoft 极其强大的 Reactive Framework。那么你可以这样做:

var query =
    from file in lstFiles.ToObservable()
    from result in Observable.Amb(
        Observable.Start(() => SomeOperation(file)).Select(_ => true),
        Observable.Timer(TimeSpan.FromMinutes(2.0)).Select(_ => false))
    select new { file, result };

IDisposable subscription =
    query
        .Subscribe(x =>
        {
            /* do something with each `new { file, result }`
               as they arrive. */
        }, ex =>
        {
            /* do something if an error is encountered */
            /* (stops processing on first error) */
        }, () =>
        {
            /* do something if they have all finished successfully */
        })

这一切都是并行完成的。 Observable.Amb 运算符启动在其参数列表中定义的两个可观察对象,并从两者中首先产生值的那个中获取值 - 如果它是 Start 可观察对象,它已经处理了你的文件,如果它是 Timer 可观察到 2.0 分钟后文件没有结果。

如果你想在处理到一半的时候停止处理那么调用subscription.Dispose().

使用 NuGet "System.Reactive" 获取位。


根据评论中的请求以 lambda 形式查询:

var query =
    lstFiles
        .ToObservable()
        .SelectMany(
            file =>
                Observable.Amb(
                    Observable.Start(() => SomeOperation(file)).Select(_ => true),
                    Observable.Timer(TimeSpan.FromMinutes(2.0)).Select(_ => false)),
            (file, result) => new { file, result });