यह जानने का सबसे अच्छा तरीका क्या है कि कोड ब्लॉक ट्रांज़ेक्शनस्कोप के अंदर है या नहीं?
लेनदेन है। इसे करने के लिए एक वास्तविक तरीका है या कोई subtleties हैं?
क्या प्रतिबिंब के साथ आंतरिक ContextData.CurrentData.CurrentScope (System.Transactions में) तक पहुंच बनाना संभव है? यदि हां, तो कैसे?कैसे पता चलेगा कि कोड ट्रांज़ेक्शनस्कोप के अंदर है या नहीं?
उत्तर
यहाँ और अधिक विश्वसनीय तरीका है (जैसा कि मैंने कहा, Transaction.Current मैन्युअल रूप से सेट किया जा सकता है और यह हमेशा मतलब यह नहीं है कि हम वास्तव में कर रहे हैं लेनदेनस्कोप में)। प्रतिबिंब के साथ यह जानकारी प्राप्त करना भी संभव है, लेकिन आईएल उत्सर्जित प्रतिबिंब से 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);
}
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
मेरा मतलब है कि लेनदेन। वर्तमान संपत्ति को तब भी सेट किया जा सकता है जब हम लेनदेनस्कोप में न हों। – nightcoder
यदि ट्रांज़ेक्शनस्कोप पूरा हो गया है, लेकिन अभी भी निपटान नहीं किया गया है, Syste.Transactions.Transaction.Curre एक अपवाद फेंकता है –
- 1. मुझे कैसे पता चलेगा कि ब्राउज़र के अंदर जावास्क्रिप्ट बंद कर दिया गया है या नहीं?
- 2. कैसे पता चलेगा कि MediaRecorder चल रहा है या नहीं?
- 3. मुझे कैसे पता चलेगा कि हार्डवेयर कीबोर्ड है या नहीं?
- 4. कैसे पता चलेगा कि नेटवर्क (डी) कनेक्ट है या नहीं?
- 5. कैसे पता चलेगा कि कोई ऑब्जेक्ट ऑटोरेलेटेड है या नहीं?
- 6. कैसे पता चलेगा कि MySQLnd सक्रिय ड्राइवर है या नहीं?
- 7. मुझे कैसे पता चलेगा कि यह यादृच्छिक है या नहीं?
- 8. कैसे पता चलेगा कि सड़क दृश्य पैनोरमा घर के अंदर या बाहर है
- 9. मुझे कैसे पता चलेगा कि .NET असेंबली में अप्रबंधित कोड है या नहीं?
- 10. यह कैसे पता चलेगा कि UserControl IsFocused
- 11. मुझे कैसे पता चलेगा कि
- 12. आईफोन - मुझे कैसे पता चलेगा कि आईओएस के लिए कंपन चालू या बंद है या नहीं?
- 13. कैसे पता चलेगा कि रूबी के माध्यम से ftp अपलोड सफलता है या नहीं?
- 14. एंड्रॉइड टॉकबैक सक्रिय है या नहीं, तो कैसे पता चलेगा?
- 15. यह कैसे पता चलेगा कि उपयोगकर्ता डेटाग्रिडव्यू
- 16. मुझे कैसे पता चलेगा कि विंडोज सीई
- 17. कैसे पता चलेगा कि कीबोर्ड दिखाना स्प्लिट या सामान्य है या नहीं?
- 18. कैसे पता चलेगा कि रिटर्न डेटा jQuery और PHP में जेसन या स्ट्रिंग है या नहीं?
- 19. मुझे कैसे पता चलेगा कि ScalaQuery
- 20. मुझे कैसे पता चलेगा कि मोशनवेन्ट सापेक्ष या पूर्ण है या नहीं?
- 21. मुझे कैसे पता चलेगा कि Google विज़ुअलाइज़ेशन
- 22. आईफोन कैसे पता चलेगा कि ब्लूटूथ हेडसेट
- 23. मुझे कैसे पता चलेगा कि पेपैल साइट
- 24. कैसे पता चलेगा कि डेटटाइम सी #
- 25. मुझे कैसे पता चलेगा कि वेबसाइकिलों के साथ कनेक्शन जिंदा है या नहीं?
- 26. कैसे पता चलेगा कि JSCrollBar JScrollPane के नीचे पहुंच गया है या नहीं?
- 27. मुझे कैसे पता चलेगा कि jQuery के पास अजाक्स अनुरोध लंबित है या नहीं?
- 28. कैसे पता चलेगा कि mysql बाइनरी लॉग sql कमांड के माध्यम से सक्षम है या नहीं?
- 29. कैसे पता चलेगा कि ग्राफिक्सपैथ में सी #
- 30. मुझे कैसे पता चलेगा कि कॉच डीबी ऊपर है और चल रहा है या नहीं?
मुझे आश्चर्य है कि आपने चार वर्षों तक उत्पादन में इस कोड का उपयोग करने के बाद "विश्वसनीय" की अपनी परिभाषा बदल दी है। –
यदि लेनदेन। वर्तमान विश्वसनीय नहीं है, तो क्यों नहीं। नेट देव ने इसे पढ़ा? क्या आपने इसके कार्यान्वयन को देखा है? –
यह .NET 4.5 "CurrentData" में दिखाई देता है जिसका नाम बदलकर "TLSCurrentData" कर दिया गया है –