小编Dan*_*ach的帖子

易失性 IEnlistmentNotification 和 TransactionScope.AsyncFlowEnabled = true

除了 .NET 4.5.1 之外,TransactionScope 上还有一个新选项,可以使用异步流。这允许编写以下客户端代码

using(var txt = new TransactionScope(..., TransactionScopeAsyncFlowOption.Enabled)
{
   await sender.SendAsync();
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。但是当我需要实现一个易失性的 IEnlistmentNotification 时,我很难做到这一点。让我们想象一下以下场景,假设:我的底层基础设施从下到上完全异步

public class MessageSender : ISendMessages
{
    public async Task SendAsync(TransportMessage message, SendOptions options)
    {
        await sender.SendAsync(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我想要实现的是引入一个像这样的易失性IEnlistmentNotification:

internal class SendResourceManager : IEnlistmentNotification
{
    private readonly Func<Task> onCommit;

    public SendResourceManager(Func<Task> onCommit)
    {
        this.onCommit = onCommit;
    }

    public void Prepare(PreparingEnlistment preparingEnlistment)
    {
        preparingEnlistment.Prepared();
    }

    public void Commit(Enlistment enlistment)
    {
        await this.onCommit();
        enlistment.Done();
    }

    public void Rollback(Enlistment enlistment)
    {
        enlistment.Done();
    }

    public void …
Run Code Online (Sandbox Code Playgroud)

.net c# transactionscope task-parallel-library async-await

5
推荐指数
1
解决办法
884
查看次数