मेरे विंडोज सेवा ऐप में मैं टाइमर का उपयोग कर रहा हूं। मैं केवल सिस्टम का उपयोग कर रहा हूँ। टाइमर। मैंने पहले इस समस्या का सामना करना कभी नहीं किया है, लेकिन अचानक मैं इस अपवाद है:.NET 3.5 C# सिस्टम के साथ बग। टाइमर सिस्टम। ऑब्जेक्ट डिस्प्ले अपवाद: एक डिस्पोजेड ऑब्जेक्ट का उपयोग नहीं कर सकता
System.ObjectDisposedException: Cannot access a disposed object.
at System.Threading.TimerBase.ChangeTimer(UInt32 dueTime, UInt32 period)
at System.Threading.Timer.Change(Int32 dueTime, Int32 period)
at System.Timers.Timer.UpdateTimer()
at System.Timers.Timer.set_Interval(Double value)
at MyApp.MySpace.MySpace2.MyClassWithTimer.MethodChangeTimerInterval()
मेरी विधि में मैं टाइमर रोक रहा हूँ, और टाइमर अंतराल बदल रहा है। यही वह जगह है जहां मुझे अपवाद मिला।
मैंने इस बग के बारे में कुछ पढ़ा है लेकिन क्या यह अभी भी यह बग है .NET 3.5 में भी?
मैं इसे कैसे ठीक करूं? क्या मुझे एक नई वस्तु को अंतराल को रोकने और सेट करने के बाद टाइमर ऑब्जेक्ट को नवीनीकृत करना चाहिए? मैं जीसी.किपलाइव (डेटा टाइमर) का उपयोग कर रहा हूं;
संपादित करें:
* मैं एक लिंक http://www.kbalertz.com/kb_842793.aspx असल में जैसे ही आप एक टाइमर रोक के रूप में पाया, आंतरिक System.Threading.Timer के लिए उपलब्ध हो जाता है: मैं इस समस्या के बारे में कुछ अन्य प्रश्न पाया कचरा संग्रह, कभी-कभी समाप्त होने वाली घटना नहीं होती है, या कभी-कभी एक डिस्पोजेड संदर्भ अपवाद उत्पन्न करती है। हालांकि लेख में वर्णित नहीं है, मेरा समाधान था जब टाइमर को हर बार एक नया टाइमर बनाने के लिए रोक दिया गया था और समाप्त हो गए ईवेंट को दोबारा जोड़ दिया गया था। कुशल लेकिन आसान नहीं, और मेरे लिए प्रोसेसर-वार समस्या नहीं है। इसने मेरी समस्या पूरी तरह हल कर ली है। सभी जो जवाब दिया के लिए चीयर्स। *
लेकिन मैं क्यों बग अभी भी वहाँ है के रूप में उलझन में हूँ, और मुझे यकीन है कि टाइमर फिर से जोड़ने एक अच्छा विचार है करने की आवश्यकता है ...
कोड है कि
private void StartAsyncResponseTimer()
{
switch (_lastRequestType)
{
case 1:
asyncResponseTimer.Interval = 1000;
break;
case 2:
asyncResponseTimer.Interval = 2000;
break;
case 3:
asyncResponseTimer.Interval = 3000;
break;
default:
asyncResponseTimer.Interval = 10000;
break;
}
asyncResponseTimer.Start();
}
समारोह SerialPortDataReceived घटना से बुलाया गया था:
private void SerialPortDataReceived(object sender, EventArgs e)
{
StartAsyncResponseTimer();
}
टाइमर बदलते अंतराल कॉल करने से पहले बंद कर दिया गया था त्रुटि के कारण।
private Timer asyncResponseTimer = new Timer();
संपादित करें:
टाइमर मेरी कक्षा का निजी क्षेत्र है आवेदन एक पंक्ति में कई महीनों के लिए चल रहा है और यह पहली बार मैं इस अपवाद मिल गया है!
मेरे निपटाने पैटर्न:
public class SerialPortCommunication{
...
private void SerialPortDataReceived(object sender, EventArgs e)
{
ReadResponse();
StartAsyncResponseTimer();
}
//used to determine if is recieving response over
private void StartAsyncResponseTimer()
{
switch (_lastRequestType)
{
case 1:
asyncResponseTimer.Interval = 1000;
break;
case 2:
asyncResponseTimer.Interval = 2000;
break;
case 3:
asyncResponseTimer.Interval = 3000;
break;
default:
asyncResponseTimer.Interval = 10000;
break;
}
asyncResponseTimer.Start();
}
public virtual void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!this._disposed)
{
if (disposing)
{
// Dispose managed resources.
}
// Dispose unmanaged resources.
_disposed = true;
Stop();
}
}
~SomeClass()
{
Dispose(false);
}
#endregion
public void Stop()
{
_asyncResponseTimer.Stop();
serialPortManager.ClosePort();
}
}
हमें अपने कोड के साथ ही त्रुटि संदेश दें - यह बहुत सहायक हो करने के लिए जब तक कि मैं कोड के कुछ और हिस्सों देख सकते हैं नहीं जा रहा है। मेरा अनुमान है कि आप "उपयोग" ब्लॉक का उपयोग कर रहे हैं जो समाप्त होने पर समाप्त होने पर कुछ ऑटो-डिस्पोजेक्ट करता है। हम आपका कोड देखेंगे और आपको बताने की कोशिश करेंगे। – Chris
क्या (जैसे एक निजी क्षेत्र या टाइमर का संग्रह) ने अपने लायक मेरी तकनीक जब टाइमर का उपयोग कर कहीं आसपास उन्हें एक संदर्भ रखना है के लिए इतना है कि मैं जानता हूँ कि वहाँ अभी भी संदर्भ हैं। इस तरह से मुझे पता है कि वे जीसीड नहीं होने से पहले जीसीड नहीं होंगे। हालांकि आप निश्चित रूप से यह सुनिश्चित करना चाहते हैं कि आप टाइमर ऑब्जेक्ट के साथ किए जाने पर उस संदर्भ को हटा दें। – Chris
मेरे पास कक्षा के निजी सदस्य के रूप में संदर्भित टाइमर है। – Simon