Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 阻止收集操作取消异常_C#_Multithreading_Parallel Processing_Task - Fatal编程技术网

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对象,尤其是取消令牌,以尝试访问源。