除了 .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)