以下是使用事务范围的异步缓存和数据库更新。我无法使用v 4.5.1中引入的TransactionScopeAsyncFlowOption.Enabled
,因为我正在使用的Apache Ignite.Net缓存不支持它。我试图通过捕捉当前Synchronization Context
,然后明确使用Synchronization Context Send
的方法来完成交易找到一个解决办法,但我仍然得到一个错误Transaction scope must be disposed on same thread it was created
启用异步TransactionScope不使用TransactionScopeAsyncFlowOption.Enabled
任何建议如何去实现这Async Update
不起作用。阿帕奇点燃支持的建议之一是使用类似:
Task.WhenAll(cacheUpdate, databaseUpdate).Wait()
,但是这将使异步代码同步,因此不是最好的选择
public async Task Update()
{
// Capture Current Synchronization Context
var sc = SynchronizationContext.Current;
TransactionOptions tranOptions = new TransactionOptions();
tranOptions.IsolationLevel = System.Transactions.IsolationLevel.RepeatableRead;
using (var ts = new TransactionScope())
{
// Do Cache Update Operation as Async
Task cacheUpdate = // Update Cache Async
// Do Database Update Operation as Async
Task databaseUpdate = // Update Database Async
await Task.WhenAll(cacheUpdate, databaseUpdate);
sc.Send(new SendOrPostCallback(
o =>
{
ts.Complete();
}), sc);
}
}
运行异步方法我不太明白你为什么不能使用TransactionScopeAsyncFlowOption.Enabled。你必须在.NET 4.0上运行? – Evk
这将使用由Apache Ignite.Net公开的缓存更新异步方法,这些方法与Java进程通信,并按照它们不支持此选项。我不知道为什么 –
的所有内部细节不知道此功能需要任何第三方组件的明确支持。 – Evk