如何在.NET 4.0的Microsoft.Bcl.Async的TransactionScope中支持异步方法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (350)

我有一种类似于:

public async Task SaveItemsAsync(IEnumerable<MyItem> items)
{
    using (var ts = new TransactionScope())
    {
        foreach (var item in items)
        {
            await _repository.SaveItemAsync(item);
        }

        await _repository.DoSomethingElse();

        ts.Complete();
    }
}

这当然有问题,因为TransactionScope不适合异步/等待。

它失败的原因是InvalidOperationException带着信息:

"A TransactionScope must be disposed on the same thread that it was created."

.NET 4.0,不能升级到4.5或4.5.1。因此,我的项目中的异步/等待行为由Microsoft.Bcl.Async NuGet Package

我在这个或任何其他OOB封装找不到TransactionScopeAsyncFlowOption.

如果没有,是否有实现同样结果的替代办法?

提问于
用户回答回答于

不确定这是否适合你的情况,但是ConfigureAwait(false)可以在ASP.NET应用程序中使用。以确保等待的函数调用重新进入调用请求上下文。

因此,如果此代码在ASP中运行。NET应用程序的代码如下:

await _repository.SaveItemAsync(item).ConfigureAwait(false);

将确保在请求线程上继续执行。

用户回答回答于

必须使用TransactionScopeAsyncFlowOption。启用

public static TransactionScope CreateAsyncTransactionScope(IsolationLevel isolationLevel = IsolationLevel.ReadCommitted)
    {
        var transactionOptions = new TransactionOptions
        {
            IsolationLevel = isolationLevel,
            Timeout = TransactionManager.MaximumTimeout
        };
        return new TransactionScope(TransactionScopeOption.Required, transactionOptions, TransactionScopeAsyncFlowOption.Enabled);
    }

所属标签

可能回答问题的人

  • 华讯云

    0 粉丝0 提问7 回答
  • gulu丶咕噜

    0 粉丝1 提问5 回答
  • 女淘日记

    杭州吱吱吱科技 · 站长 (已认证)

    1 粉丝1 提问3 回答
  • 卓脑域名

    0 粉丝0 提问3 回答

扫码关注云+社区

领取腾讯云代金券