मेरे पास कोड ब्लॉक की एक श्रृंखला है जो बहुत अधिक समय ले रही है। जब यह विफल रहता है तो मुझे किसी भी प्रकार की आवश्यकता नहीं होती है। असल में, मैं एक अपवाद फेंकना चाहता हूं जब ये ब्लॉक बहुत अधिक समय लेते हैं, और हमारे मानक त्रुटि प्रबंधन से बाहर निकलते हैं। मैं प्रत्येक ब्लॉक से विधियों को नहीं बनाना पसंद करूंगा (जो अब तक केवल एक ही सुझाव हैं जिन्हें मैंने देखा है), क्योंकि इसे कोड बेस के एक बड़े पुनर्लेख की आवश्यकता होगी।विभिन्न कोड ब्लॉक के लिए जेनेरिक टाइमआउट ऑब्जेक्ट कैसे बनाएं?
यदि संभव हो, तो मैं जैसे को बनाने के लिए यहां हूं।
public void MyMethod(...)
{
...
using (MyTimeoutObject mto = new MyTimeoutObject(new TimeSpan(0,0,30)))
{
// Everything in here must complete within the timespan
// or mto will throw an exception. When the using block
// disposes of mto, then the timer is disabled and
// disaster is averted.
}
...
}
मैंने टाइमर क्लास का उपयोग करके ऐसा करने के लिए एक साधारण वस्तु बनाई है। (ध्यान दें कि उन/पेस्ट कॉपी किए जाने के लिए: इस कोड काम नहीं करता !!)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
public class MyTimeoutObject : IDisposable
{
private Timer timer = null;
public MyTimeoutObject (TimeSpan ts)
{
timer = new Timer();
timer.Elapsed += timer_Elapsed;
timer.Interval = ts.TotalMilliseconds;
timer.Start();
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
throw new TimeoutException("A code block has timed out.");
}
public void Dispose()
{
if (timer != null)
{
timer.Stop();
}
}
}
यह काम नहीं करता क्योंकि System.Timers.Timer वर्ग कैप्चर, अवशोषित करता है और भीतर फेंक दिया किसी भी अपवाद पर ध्यान नहीं देता, जो - जैसा कि मैंने पाया है - मेरे डिजाइन को हराता है। कुल वर्गीकरण के बिना इस वर्ग/कार्यक्षमता को बनाने का कोई अन्य तरीका?
यह दो घंटे पहले इतना आसान लग रहा था, लेकिन मुझे बहुत सिरदर्द पैदा कर रहा है।
क्या आप ऊपरी स्तर पर किसी भी अपवाद को संभालने वाले हैं, जहां से आप इस विधि को कॉल करते हैं? इसके अलावा, क्या यह एक बहु थ्रेडेड वातावरण है? – Shaharyar
आप 'रद्दीकरण टोकन' की एक स्थिर दुकान का उपयोग कर सकते हैं और उन सभी जगहों का उपयोग कर सकते हैं जिनके पास आपके पास कार्य है, या कम सुरुचिपूर्ण लेकिन शायद अधिक प्रभावी - एक और प्रक्रिया है जो आपकी मुख्य प्रक्रिया को मार सकती है और स्थानीय HTTP या नामित पाइपों पर लागू की जाती है –
शाहरारी: हाँ। पकड़ श्रृंखला दूर है। और हाँ, यह एक बहु थ्रेडेड वातावरण है। लाइब्रेरी जो मैं लिख रहा हूं वह WinForms अनुप्रयोगों के भीतर प्रयोग की जानी चाहिए, न कि वेब पर। – Jerry