我正在尝试将async
/await
集成到我们的服务总线中。我基于这个示例http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx实现了一个SingleThreadSynchronizationContext
。
它工作得很好,除了一件事:TransactionScope
。我在等待TransactionScope
中的东西,它破坏了TransactionScope
。
TransactionScope
似乎不能很好地处理async
/await
,当然是因为它使用ThreadStaticAttribute
在线程中存储内容。我得到了这个例外:
"TransactionScope嵌套不正确。“。
我尝试在将任务排队之前保存TransactionScope
数据,并在运行任务之前恢复它,但似乎没有任何改变。而且TransactionScope
代码一团糟,所以真的很难理解那里发生了什么。
有没有办法让它工作呢?是否有TransactionScope
的替代方案
发布于 2013-07-08 21:21:43
在.NET框架4.5.1中,有一组接受TransactionScopeAsyncFlowOption
参数new constructors for TransactionScope
。
根据MSDN的说法,它支持跨线程延续的事务流。
我的理解是,它的目的是让你可以像这样写代码:
// 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();
}
发布于 2014-05-04 10:26:08
回答有点晚了,但我在MVC4上遇到了同样的问题,我通过右键单击项目转到属性,将我的项目从4.5更新到4.5.1。选择application tab,将target framework更改为4.5.1,并使用transaction,如下所示。
using (AccountServiceClient client = new AccountServiceClient())
using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
}
发布于 2012-12-26 08:16:02
您可以使用Transaction.DependentClone()方法创建的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();
}
Managing Concurrency with DependentTransaction
http://adamprescott.net/2012/10/04/transactionscope-in-multi-threaded-applications/
https://stackoverflow.com/questions/13543254
复制相似问题