检查 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 });
我有 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 });