【发布时间】:2015-01-30 09:19:53
【问题描述】:
除了 .NET 4.5.1 之外,TransactionScope 上还有一个新选项,可以使用异步流。这允许编写以下客户端代码
using(var txt = new TransactionScope(..., TransactionScopeAsyncFlowOption.Enabled)
{
await sender.SendAsync();
}
到目前为止一切顺利。但是当我需要实现一个不稳定的 IEnlistmentNotification 时,我正在努力做到这一点。让我们想象一下下面的场景,假设:我的底层基础设施是从下到上完全异步的
public class MessageSender : ISendMessages
{
public async Task SendAsync(TransportMessage message, SendOptions options)
{
await sender.SendAsync(message);
}
}
所以我想要实现的是像这样引入一个 volatile 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 InDoubt(Enlistment enlistment)
{
enlistment.Done();
}
}
和新的发件人
public class MessageSender : ISendMessages
{
public async Task SendAsync(TransportMessage message, SendOptions options)
{
// Dirty: Let's assume Transaction.Current is never null
Transaction.Current.EnlistVolatile(new SendResourceManager(async () => { await sender.SendAsync(message) }));
}
}
注意:当然,这段代码不会编译。它需要我声明提交方法 async void。这太棒了。
所以我的问题是:如何编写可以在内部等待异步操作的登记?
【问题讨论】:
标签: c# .net task-parallel-library async-await transactionscope