获取TransactionScope使用asynchronous/等待

我正在尝试将async / await集成到我们的服务总线中。 我基于此示例实现了SingleThreadSynchronizationContext http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx 。

它的工作正常,除了一件事: TransactionScope 。 我等待TransactionScope内部的东西,它打破了TransactionScope

TransactionScope似乎并不async / await ,当然是因为它使用ThreadStaticAttribute将事物存储在线程中。 我得到这个例外:

“TransactionScope嵌套错误。”

我尝试在排队任务之前保存TransactionScope数据,并在运行之前将其还原,但似乎没有改变任何事情。 而TransactionScope代码是一团糟,所以真的很难理解那里发生的事情。

有没有办法让它工作? 是否有一些替代TransactionScope

在.NET Framework 4.5.1中,有一组用于TransactionScope的新构造函数,它们使用TransactionScopeAsyncFlowOption参数。

根据MSDN,它允许跨线程延续的事务stream。

我的理解是,它是为了让你写这样的代码:

 // transaction scope using (var scope = new TransactionScope(... , TransactionScopeAsyncFlowOption.Enabled)) { // connection using (var connection = new SqlConnection(_connectionString)) { // open connection asynchronously await connection.OpenAsync(); using (var command = connection.CreateCommand()) { command.CommandText = ...; // run command asynchronously using (var dataReader = await command.ExecuteReaderAsync()) { while (dataReader.Read()) { ... } } } } scope.Complete(); } 

答案迟了一点,但我有与MVC4相同的问题,我更新我的项目从4.5到4.5.1右键单击项目去属性。 select应用程序选项卡更改目标框架为4.5.1并使用事务如下。

 using (AccountServiceClient client = new AccountServiceClient()) using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { } 

你可以使用由Transaction.DependentClone()方法创build的DependentTransaction :

 static void Main(string[] args) { // ... for (int i = 0; i < 10; i++) { var dtx = Transaction.Current.DependentClone( DependentCloneOption.BlockCommitUntilComplete); tasks[i] = TestStuff(dtx); } //... } static async Task TestStuff(DependentTransaction dtx) { using (var ts = new TransactionScope(dtx)) { // do transactional stuff ts.Complete(); } dtx.Complete(); } 

使用DependentTransactionpipe理并发

http://adamprescott.net/2012/10/04/transactionscope-in​​-multi-threaded-applications/