以下是使用事務範圍的異步緩存和數據庫更新。我無法使用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