获取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/
- 如何使用LINQasynchronous地等待任务列表?
- 为什么ConfigureAwait(false)不是默认选项?
- 不能隐式地将types“string”转换为“System.Threading.Tasks.Task <string>”
- 来自.Net 4.5的asynchronousHttpClient是密集加载应用程序的不好select吗?
- InvokeAsync和WPF Dispatcher的BeginInvoke之间有什么区别
- 为什么在等待后HttpContext.Current为空?
- Task.Result与.GetAwaiter.GetResult()相同吗?
- 入口点不能用“asynchronous”修饰符标记
- 为什么不能“asynchronous无效”unit testing被识别?