7

मुझे वास्तव में यह नहीं पता कि इस त्रुटि में यह त्रुटि कैसा चल रहा है। कृपया कोड को स्वयं जांचेंसंरक्षित स्मृति को पढ़ने या लिखने का प्रयास किया गया। यह अक्सर एक संकेत है कि अन्य स्मृति भ्रष्ट है

void dispatcherTimer_Tick(object sender, EventArgs e) 
{ 
    string srUrl = lstLocalIndex[irLocalIndex] + lstMainIndex[irMainIndex].Replace("0;",""); 

    Task.Factory.StartNew(() => 
    { 
     startNewWindow(srUrl); 
    }); 

} 


    void startNewWindow(string srUrl) 
{ 
    NewWindowThread<TitleWindow, string>(c => new TitleWindow(c), srUrl); 
} 

अब यह कोड है जहां त्रुटि हो रही है। मैं भी स्क्रीनशॉट संलग्न होगा

 private void NewWindowThread<T, P>(Func<P, T> constructor, P param) where T : Window 
    { 
     Thread thread = new Thread(() => 
     { 
      T w = constructor(param); 
      w.Show(); 
      w.Closed += (sender, e) => w.Dispatcher.InvokeShutdown(); 
      try 
      { 
       System.Windows.Threading.Dispatcher.Run(); 
      } 
      catch 
      { 

      } 
     }); 
     thread.SetApartmentState(ApartmentState.STA); 
     try 
     { 
      thread.Start(); 
     } 
     catch 
     { 

     } 
    } 

यह त्रुटि पूरे सॉफ्टवेयर फेंक त्रुटि होती है और काम कर रहा है, भले ही मैं उन्हें नया थ्रेड में बोल रहा हूँ :(

इस लाइन फेंक त्रुटि System.Windows.Threading.Dispatcher बंद करो। भागो();

कृपया यह भी जाँचें स्क्रीनशॉट

enter image description here

सी # 4.0 डब्ल्यूपीएफ

+0

आप वास्तव में * दो * धागे, 'टास्क' में से एक और फिर 'थ्रेड' का उपयोग कर रहे हैं, बस उस कोड को रखने के लिए बेहतर है जिसे आप 'थ्रेड' में स्टार्टअप कोड के रूप में चलाने के लिए चाहते हैं। – casperOne

+0

@casperOne मैंने यह भी कोशिश की कि अभी भी एप्लिकेशन क्रैश हो रहा है। और यह थोड़ी देर के बाद तुरंत हो रहा है। यह 30 मिनट की तरह चलता है तो दुर्घटनाग्रस्त हो जाता है। क्रैशिंग समय बदलता है। – MonsterMMORPG

+0

नहीं, वे कहते हैं कि आपकी याददाश्त टूट गई है। ऐसा होना चाहिए! (बीटीडब्ल्यू जो कि सबसे अनिश्चित त्रुटि संदेश है, मुझे 'अनिर्दिष्ट त्रुटि' के बाद सामना करना पड़ा है)। – leppie

उत्तर

0

आप एक थंब फ़ंक्शन के रूप में लैम्ब्डा का उपयोग कर रहे हैं। यह लैम्ब्डा को एक नए धागे पर बुलाया जाता है। पल पर वास्तव में धागा बनाया गया है, यह आपके द्वारा प्रदान किए जाने वाले तर्क की तलाश करेगा, जो एक स्थानीय चर srrrl है, लेकिन जब तक ऐसा होता है तो आपका फ़ंक्शन (dispatcherTimer_Tick) पहले से ही निकल चुका है, इसलिए srUrl एक हिस्से में होगा ढेर जो अब उचित रूप से परिभाषित नहीं किया गया है (इसलिए पहुंच उल्लंघन)। आसान फिक्स कक्षा में एक चर को परिभाषित करना है और वहां एसआरएलओसी को जल्दी से सामान देना है। एक और अधिक उचित समाधान वास्तव में तर्क के रूप में srLoc पारित करने के लिए है:

() => 
{ 
    startNewWindow(srUrl); 
} 

हो जाता है

(Action<string>){x => {startNewWindow(x);}, 
      new object[] {srUrl} 

अब समारोह संदर्भ और तार का एक उचित प्रतिलिपि समारोह कॉल के लिए सहेजा जाता है और यह नहीं करता है इससे कोई फर्क नहीं पड़ता कि मूल srrrl थ्रेड के समय तक गुंजाइश से बाहर है। मुझे यकीन नहीं है कि कार्य फैक्ट्री तर्क सरणी को पारित करने की अनुमति देती है या नहीं। प्रेषक के पास आमतौर पर इसके लिए अधिभार होता है, इसलिए हो सकता है कि आप अपनी खिड़की को इस पर ध्यान दें।

अब आप वास्तव में इसे कुछ बार करते हैं, इसलिए आपको प्रत्येक बार पारित होने पर तर्कों को लपेटने की आवश्यकता हो सकती है।

+0

उत्तर के लिए धन्यवाद। असल में मैंने एक और एप्लीकेशन लिखकर अपनी समस्या हल की जो फ़ाइल से यूआरएल पढ़ता है। तो मैं अब नई खिड़कियों के बजाय exes शुरू कर रहा हूँ। कुछ बार इन नए पूर्व त्रुटियों को दे रहे हैं लेकिन सॉफ्टवेयर चल रहा है :) लेकिन आपका जवाब वास्तव में पेशेवर है मुझे यह पसंद है। – MonsterMMORPG

+1

@MonsterMMORPG यह उत्तर तार्किक लग सकता है लेकिन यह गलत है। बंद स्थानीय चर को कैप्चर करेगा (जिसे एक फ्री वैरिएबल कहा जाता है)। यहां भी देखें: http://www.codethinked.com/c-closures-explained – ChrisWue

+0

यदि यह सत्य था तो आपका कोड विंडो दिखाने से पहले तोड़ देगा। खिड़की दिखाने के बाद srUrl का उपयोग नहीं किया जा रहा है। – surfen

1

मुझे कुछ समय पहले इसी तरह की समस्या थी।

त्रुटि तब होती है क्योंकि आपकी खिड़की गुंजाइश से बाहर हो जाती है और कचरा कलेक्टर इसे नष्ट कर देता है।

ShowDialog() का उपयोग करना समस्या को हल करना चाहिए। ध्यान दें कि ऐसा करने से अन्य धागे अवरुद्ध नहीं होंगे क्योंकि विंडो केवल कॉलिंग थ्रेड में मोडल होगी।

private void NewWindowThread<T, P>(Func<P, T> constructor, P param) where T : Window 
{ 
    Thread thread = new Thread(() => 
    { 
     System.Windows.Threading.Dispatcher.Run(); 
     T w = constructor(param); 
     w.ShowDialog(); 
     w.Dispatcher.InvokeShutdown(); 
    }); 
    thread.SetApartmentState(ApartmentState.STA); 
    try 
    { 
     thread.Start(); 
    } 
    catch 
    { 
     // log&handle exceptions 
    } 
} 
+0

यदि सच है ... आप लोड किए गए ईवेंट में एक ईवेंट सेट करके और प्रतिनिधि से बाहर निकलने से पहले उस घटना पर प्रतीक्षा करके कुछ ऐसा कर सकते हैं। – Yaur

+0

यह समझ में आता है लेकिन क्या यह नव निर्मित विंडो के यूआई को अवरुद्ध नहीं करेगा? उत्तर के लिए – surfen

+0

धन्यवाद। अभी कोशिश करने जा रहा है। – MonsterMMORPG

2

मैं इस मुद्दे को एक ग्राहक के साथ लड़ रहा हूं और यहां मुझे जो मिला है वह यहां है।

हम एक WPF एप्लिकेशन पर काम कर रहे हैं जो बहुत सारे थ्रेडिंग और पृष्ठभूमि कार्यकर्ता प्रसंस्करण करता है। यह अपवाद अचानक शुरू हो गया और मैंने कुछ खोदना शुरू कर दिया।

 var worker = new BackgroundWorker(); 
     worker.DoWork += (o, ea) => Dispatcher.BeginInvoke(new Action(() => 
     { 
      //do some heavy processing here, plus UI work, then call another method. 

      //inside that other method, I found this: 
      var thread = new Thread(() => 
      { 
       //do some heavy processing. 
      }) { IsBackground = true }; 
      thread.Start(); 
     })); 

क्या हो रहा गया प्रतीत होता है कि पृष्ठभूमि कार्यकर्ता अपने काम खत्म करने और इसके निष्पादन से लौट रहा है: मैं अंत में जांच के लगभग एक घंटे बाद अपराधी पाया।हालांकि, उस पृष्ठभूमि कार्यकर्ता के अंदर बनाया गया थ्रेड प्रसंस्करण नहीं किया जाता है और केवल यह पता लगाने के लिए लौटाता है कि जिस धागे पर बनाया गया था वह पहले से ही गुंजाइश से बाहर हो गया है, जिसके परिणामस्वरूप AccessViolationException में परिणाम हुआ है।

इसे डीबग करने के लिए, मैं सुझाव देता हूं कि अपवाद होता है और आपके कॉल स्टैक की बारीकी से जांच कर रहा है, जो कि धागे के अंदर हैं या नहीं, इस पर निर्भर करता है कि आप नष्ट हो सकते हैं या खो गए हैं या नहीं अपवाद फेंक दिया जाता है।