इसे इस तरह से देखने का प्रयास करें:
लेन-देन की अवधि केवल तभी निर्धारित की जाती है जब आप trans.Complete() को कॉल करते हैं या लेन-देन के दायरे से बाहर निकलते हैं। निम्नलिखित कोड लें:
using (var trans= new TransactionScope())
{
Threading.Sleep(99999);
trans.Complete()
}
स्लीप रूटीन के अंदर टाइमआउट अपवाद फेंकने का कोई तरीका नहीं है और अगर ऐसा हुआ तो इसका कोई मतलब नहीं होगा। और इसलिए लेन-देन टाइमआउट (इस तरह से कम से कम) का उपयोग केवल गारंटी दे सकता है कि यदि लेनदेन आपके टाइमआउट से अधिक समय लेता है, तो यह प्रतिबद्ध नहीं होगा।
यदि आप केवल एक प्रश्न निष्पादित कर रहे हैं (जो मुझे नहीं पता कि आप किस लेन-देन का उपयोग करते हैं) तो आप क्वेरी/कमांड टाइमआउट (या जिसे आप इसे कहते हैं) सेट कर सकते हैं। IIRC, समय समाप्त होने के तुरंत बाद आपकी क्वेरी वापस आ जाएगी।
दूसरा तरीका यह होगा कि आप अपने वेब सेवा अनुरोध का समयबाह्य सेट करें और मान लें कि आपके लेन-देन में जो कुछ भी था, उसके कारण webservice को प्रतिक्रिया देने में बहुत अधिक समय लग रहा है।
संपादित करें:आप कोशिश कर सकते हैं:
- अपने लेन-देन को एक अलग थ्रेड पर फैलाना और फिर इसके पूरा होने की प्रतीक्षा करें (Thread.Join(timeout) का उपयोग करके) अपने मुख्य थ्रेड पर (एक webservice कॉल द्वारा उपयोग किया जाता है)। इसलिए यदि यह आपके द्वारा निर्दिष्ट टाइमआउट से पहले समाप्त नहीं होता है तो आप प्रतीक्षा करना बंद कर सकते हैं और टाइमआउट त्रुटि वापस कर सकते हैं (लेनदेन को रद्द करने के लिए अन्य थ्रेड को सिग्नल करना न भूलें)।
- मान लें कि आप केवल उन लेन-देन के अंदर SQL क्वेरी निष्पादित कर रहे हैं, आप sql स्क्रिप्ट में लेनदेन निर्दिष्ट करने के लिए "BEGIN TRANSACTION" कीवर्ड का उपयोग कर सकते हैं (वास्तव में हैकी)। तब आप केवल कमांड टाइमआउट निर्दिष्ट कर सकते हैं और कोड की एक पंक्ति में यह सब निष्पादित कर सकते हैं। लेकिन फिर इसके लिए आपको लेन-देन के अंदर जो कुछ भी करते हैं उसे एक sql स्क्रिप्ट में स्थानांतरित करने की आवश्यकता होती है जो आपके लिए संभव हो भी सकता है और नहीं भी... और यह साफ नहीं है।