知道代碼塊是否在TransactionScope中的最佳方式是什麼?
是Transaction.Current做一個可行的方法或有任何微妙之處?
是否有可能通過反射訪問內部ContextData.CurrentData.CurrentScope(在System.Transactions中)?如果是,如何?如何知道代碼是否在TransactionScope中?
25
A
回答
4
這裏是更可靠的方式(正如我所說,Transaction.Current可以手動設置,它並不總是意味着我們真的在TransactionScope中)。通過反射也可以獲得這些信息,但發射IL的速度比反射快100倍。
private Func<TransactionScope> _getCurrentScopeDelegate;
bool IsInsideTransactionScope
{
get
{
if (_getCurrentScopeDelegate == null)
{
_getCurrentScopeDelegate = CreateGetCurrentScopeDelegate();
}
TransactionScope ts = _getCurrentScopeDelegate();
return ts != null;
}
}
private Func<TransactionScope> CreateGetCurrentScopeDelegate()
{
DynamicMethod getCurrentScopeDM = new DynamicMethod(
"GetCurrentScope",
typeof(TransactionScope),
null,
this.GetType(),
true);
Type t = typeof(Transaction).Assembly.GetType("System.Transactions.ContextData");
MethodInfo getCurrentContextDataMI = t.GetProperty(
"CurrentData",
BindingFlags.NonPublic | BindingFlags.Static)
.GetGetMethod(true);
FieldInfo currentScopeFI = t.GetField("CurrentScope", BindingFlags.NonPublic | BindingFlags.Instance);
ILGenerator gen = getCurrentScopeDM.GetILGenerator();
gen.Emit(OpCodes.Call, getCurrentContextDataMI);
gen.Emit(OpCodes.Ldfld, currentScopeFI);
gen.Emit(OpCodes.Ret);
return (Func<TransactionScope>)getCurrentScopeDM.CreateDelegate(typeof(Func<TransactionScope>));
}
[Test]
public void IsInsideTransactionScopeTest()
{
Assert.IsFalse(IsInsideTransactionScope);
using (new TransactionScope())
{
Assert.IsTrue(IsInsideTransactionScope);
}
Assert.IsFalse(IsInsideTransactionScope);
}
35
Transaction.Current
應該是可靠的;我剛剛檢查,這正常工作與抑制交易,太:
Console.WriteLine(Transaction.Current != null); // false
using (TransactionScope tran = new TransactionScope())
{
Console.WriteLine(Transaction.Current != null); // true
using (TransactionScope tran2 = new TransactionScope(
TransactionScopeOption.Suppress))
{
Console.WriteLine(Transaction.Current != null); // false
}
Console.WriteLine(Transaction.Current != null); // true
}
Console.WriteLine(Transaction.Current != null); // false
相關問題
- 1. 如何從Java代碼知道VM是否正在調試?
- 2. 如何知道TaskTracker是否正在運行Java代碼?
- 3. 如何知道內核代碼是否是原子?
- 4. 如何知道是否使用ASCII碼?
- 5. 代碼知道wifi是否啓用和藍牙是否在iphone
- 6. 如何實現知道TransactionScope的類?
- 7. 我如何知道我的代碼是否可合成? [Verilog]
- 8. scipy.weave.inline命令如何知道代碼是否先前編譯過?
- 9. 如何知道代碼是否需要eval()
- 10. 如何知道scipy函數是否使用C代碼?
- 11. 有沒有辦法檢查代碼是否在TransactionScope中執行?
- 12. 如何知道是否
- 13. 如何從CoInstaller代碼中知道設備是否存在(present = plugged in)?
- 14. 下拉框:如何知道在下面的代碼中是否選擇了值
- 15. 如何知道在scala代碼中是否有未經處理的異常?
- 16. 如何知道目標C代碼是否在iOS模擬器中運行?
- 17. 通知中心 - 如何知道是否存在「未讀」通知?
- 18. 如何知道用戶是否在線?
- 19. 如何知道我是否在回傳?
- 20. 如何知道文件是否存在?
- 21. 如何知道是否正在對angular2
- 22. 如何知道是否存在NSUserDefault?
- 23. 如果Git不知道它是否可以更改代碼?
- 24. QR代碼,不知道他們是否在黑莓上工作
- 25. 如何知道重載賦值運算符中的代碼是否執行?
- 26. 如何知道我的代碼在執行時間方面是否高效?
- 27. 如何知道在編譯內核代碼時是否有錯誤?
- 28. 正在閱讀的html代碼,如何知道是否會被下載?
- 29. 不知道是否Node.js代碼是異步的
- 30. 如何知道NSURLSessionConfiguration是否是backgroundSessionConfiguration?
我的意思是,即使我們不在TransactionScope中,也可以設置Transaction.Current屬性。 – nightcoder 2009-06-11 10:31:14
如果TransactionScope已完成但尚未處置,Syste.Transactions.Transaction.Curre會引發異常 – 2016-05-18 13:06:51