C# 阻止收集操作取消异常
我们在后台线程中读取C# 阻止收集操作取消异常,c#,multithreading,parallel-processing,task,C#,Multithreading,Parallel Processing,Task,我们在后台线程中读取BlockingCollection以报告进度。偶尔排队 foreach (int i in collection.GetConsumingEnumerable()) 将抛出一个操作取消异常。这似乎很不寻常,因为看不到取消令牌。事实上,正如GetConsmingEnumerable方法的文档中所提到的那样,我希望出现一个ObjectDisposedException。有人知道发生了什么吗?这只是偶尔发生 class Program { public static v
BlockingCollection
以报告进度。偶尔排队
foreach (int i in collection.GetConsumingEnumerable())
将抛出一个操作取消异常
。这似乎很不寻常,因为看不到取消令牌。事实上,正如GetConsmingEnumerable
方法的文档中所提到的那样,我希望出现一个ObjectDisposedException
。有人知道发生了什么吗?这只是偶尔发生
class Program
{
public static void Process()
{
var collection = new System.Collections.Concurrent.BlockingCollection<int>();
Task.Factory.StartNew(() =>
{
foreach (int i in collection.GetConsumingEnumerable())
{
Console.WriteLine(i); // simulate reporting progress
}
}, TaskCreationOptions.LongRunning);
var input = Enumerable.Range(1, 100); // simulate list of items to do work on
Parallel.ForEach(input, i =>
{
Thread.Sleep(100); // Simulate doing work
collection.Add(i);
});
collection.CompleteAdding();
}
static void Main(string[] args)
{
Process();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Console.ReadKey();
}
}
类程序
{
公共静态无效进程()
{
var collection=new System.Collections.Concurrent.BlockingCollection();
Task.Factory.StartNew(()=>
{
foreach(集合中的int i.getconsumineGenumerable())
{
Console.WriteLine(i);//模拟报告进度
}
},TaskCreationOptions.LongRunning);
var input=Enumerable.Range(1100);//模拟要处理的项的列表
Parallel.ForEach(输入,i=>
{
Thread.Sleep(100);//模拟工作
收藏。添加(i);
});
collection.CompleteAdding();
}
静态void Main(字符串[]参数)
{
过程();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Console.ReadKey();
}
}
可能值得一看。我确实这样做了,而且似乎只有在请求取消时才会抛出操作取消异常
,但事实并非如此。显然,某些东西正在执行取消操作,即使从您的角度来看,这并不合作。调查OperationCancelledException对象,尤其是取消令牌,以尝试访问源。