C# 将TransactionScope与Parallel.Foreach循环一起使用
我正在尝试将事务与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
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
块的末尾将项目添加到队列中,以确保在遇到异常时不会首先添加该项目?回滚语义不必要地使事情复杂化,因为它们需要回滚的实际支持。