Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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# 将TransactionScope与Parallel.Foreach循环一起使用_C#_Parallel Processing_Transactions_Task Parallel Library_Parallel.foreach - Fatal编程技术网

C# 将TransactionScope与Parallel.Foreach循环一起使用

C# 将TransactionScope与Parallel.Foreach循环一起使用,c#,parallel-processing,transactions,task-parallel-library,parallel.foreach,C#,Parallel Processing,Transactions,Task Parallel Library,Parallel.foreach,我正在尝试将事务与Parallel.Foreach一起使用 代码段: List<int> iList = new List<int>(); // Having int random numbers /// To check final collection count ConcurrentQueue<int> q= new ConcurrentQueue<in>(); using(var scope = new TransactionScop

我正在尝试将事务与Parallel.Foreach一起使用

代码段:

List<int> iList = new List<int>(); // Having int random numbers

/// To check final collection count

ConcurrentQueue<int> q= new ConcurrentQueue<in>();

using(var scope = new TransactionScope())
{

    Transaction rootTr = Transaction.Current;

    Parallel.ForEach(iLIst, item =>
    {

        DependentTransaction dt = rootTr.DependentClone(DependentCloneOption.RollbackIfNotComplete);

        if(item == 7)
             throw new ArgumentException("7 occurred"); // This is throwing Exception

        q.Enqueue(item);

        Thread.Sleep(5000);

        dt.Complete();
    });

    ts.Complete();
}
List iList=new List();//有整数随机数的
///检查最终收集计数
ConcurrentQueue q=新的ConcurrentQueue();
使用(var scope=new TransactionScope())
{
Transaction rootTr=Transaction.Current;
Parallel.ForEach(iLIst,item=>
{
DependentTransaction dt=rootTr.DependentClone(DependentClone选项.RollbackIfNotComplete);
如果(项目==7)
抛出新的ArgumentException(“7已发生”);//这是抛出异常
q、 排队(项目);
睡眠(5000);
dt.Complete();
});
ts.完成();
}
但我得到了异常,但我在队列(q)中看到了值


我希望完全回滚所有并行处理项,以便在出现故障时队列(q)为空

在事务中使用TPL计算调用可能是一个坏主意,在等待I/O完成时会破坏并行性。线程也是如此。睡眠(5000);。您可能应该使用TPL Dataflow可能是相关的
ConcurrentQueue
不知道事务,句号。
q.Enqueue
是使用外部资源的替代品,还是您希望在交易中实际发生的事情?发生故障时获取空队列的最简单方法是在
catch
Thread.Sleep(5000)中清空队列;表示完成了一些工作。ConcurrentQueue q==>表示如果事务未成功,它应该回滚对队列所做的任何更改,并且应该为空。想想某个共享资源的队列,其输出来自并行处理(即parallel.Foreach),想想“某个”共享资源是毫无意义的。为了使用
TransactionScope
,您需要事务感知类(如
SqlConnection
)。您无法使用
TransactionScope
解决一般事务类问题(除非您为其编写了基础结构)。为什么不只在
try
块的末尾将项目添加到队列中,以确保在遇到异常时不会首先添加该项目?回滚语义不必要地使事情复杂化,因为它们需要回滚的实际支持。在事务中使用TPL计算调用可能是一个坏主意,在等待I/O完成时会破坏并行性。线程也是如此。睡眠(5000);。您可能应该使用TPL Dataflow可能是相关的
ConcurrentQueue
不知道事务,句号。
q.Enqueue
是使用外部资源的替代品,还是您希望在交易中实际发生的事情?发生故障时获取空队列的最简单方法是在
catch
Thread.Sleep(5000)中清空队列;表示完成了一些工作。ConcurrentQueue q==>表示如果事务未成功,它应该回滚对队列所做的任何更改,并且应该为空。想想某个共享资源的队列,其输出来自并行处理(即parallel.Foreach),想想“某个”共享资源是毫无意义的。为了使用
TransactionScope
,您需要事务感知类(如
SqlConnection
)。您无法使用
TransactionScope
解决一般事务类问题(除非您为其编写了基础结构)。为什么不只在
try
块的末尾将项目添加到队列中,以确保在遇到异常时不会首先添加该项目?回滚语义不必要地使事情复杂化,因为它们需要回滚的实际支持。