我整理了一个简单的应用程序,该应用程序监视文件创建事件,从文件内容创建一些对象并进行一些处理。这是示例代码:
class Program
{
private const string Folder = "C:\\Temp\\InputData";
static void Main(string[] args)
{
var cts = new CancellationTokenSource();
foreach (var obj in Input(cts.Token))
Console.WriteLine(obj);
}
public static IEnumerable<object> Input(CancellationToken cancellationToken)
{
var fileList = new BlockingCollection<string>();
var watcher = new FileSystemWatcher(Folder);
watcher.Created += (source, e) =>
{
if (cancellationToken.IsCancellationRequested)
watcher.EnableRaisingEvents = false;
else if (Path.GetFileName(e.FullPath) == "STOP")
{
watcher.EnableRaisingEvents = false;
fileList.CompleteAdding();
File.Delete(e.FullPath);
}
else
fileList.Add(e.FullPath);
};
watcher.EnableRaisingEvents = true;
return from file in
fileList.GetConsumingEnumerable(cancellationToken)
//.AsParallel()
//.WithCancellation(cancellationToken)
//.WithDegreeOfParallelism(5)
let obj = CreateMyObject(file)
select obj;
}
private static object CreateMyObject(string file)
{
return file;
}
}
一切正常,但是当我取消注释AsParallel(以及接下来的两行)时,不会立即产生结果。这种延迟可能是由PLINQ分区引起的吗?但是,我希望此查询在将项目添加到BlockingCollection时立即产生它们。使用PLINQ是否可以实现?
最佳答案
那就是.WithMergeOptions(ParallelMergeOptions.NotBuffered)
应该被设计的。
关于c# - 使PLINQ和BlockingCollection一起工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7533067/