2010-08-16 16 views
5

मेरे Windows में मालिक है मैं किसी पाठ बॉक्स जो मैं एक धागे से (पाठ संपत्ति) को अपडेट करना चाहते है बुला धागा इस वस्तु का उपयोग नहीं कर सकते हैं। ऐसा करने पर, मुझे अमान्यऑपरेशन अपवाद (शीर्षक देखें) मिलता है। मुझे Google को यह समझाते हुए अलग-अलग लिंक मिल गए हैं, लेकिन मैं अभी भी इसे काम नहीं कर सकता।WPF System.InvalidOperationException: क्योंकि एक अलग धागा यह

Window1 कोड:

यह क्या मैं कोशिश की है है

private static Window1 _myWindow; 
private MessageQueueTemplate _messageQueueTemplate; 
private const string LocalTemplateName = "LocalExamSessionAccessCodeMessageQueueTemplate"; 
private const string RemoteTemplateName = "RemoteExamSessionAccessCodeMessageQueueTemplate"; 

... 
public Window1() 
{ 
    InitializeComponent(); 
    _myWindow = this; 
} 

public static Window1 MyWindow 
{ 
    get 
    { 
     return _myWindow; 
    } 
} 

public void LogText(string text) 
{ 
    informationTextBox.Text += text + Environment.NewLine; 
} 
... 

अन्य वर्ग में (वास्तव में एक spring.NET श्रोता एडाप्टर, एक निश्चित कतार को सुन, एक और धागा में शुरू किया था)।

var thread = new Thread(
    new ThreadStart(
     delegate() 
      { 
       Window1.MyWindow.Dispatcher.Invoke(
        System.Windows.Threading.DispatcherPriority.Normal, 
        new Action(
         delegate() 
          { 
           Window1.MyWindow.LogText(text); 
          } 
         )); 
      } 
     )); 

यह एक त्रुटि फेंक नहीं है, लेकिन Window1 में LogText विधि में पाठ शुरू हो रहा है, तो पाठ अद्यतन नहीं किया गया है।

तो बुनियादी तौर पर, मैं एक और धागा में अन्य वर्ग चल रहा से इस टेक्स्ट बॉक्स घटक अद्यतन करना चाहते।

उत्तर

6
Window1.MyWindow.informationTextBox.Dispatcher.Invoke(
    DispatcherPriority.Normal, 
    new Action(() => Window1.MyWindow.informationTextBox.Text += value)); 
3

खैर, Dispatcher.Invoke या BeginInvoke का उपयोग कर निश्चित रूप से जाने का रास्ता है, लेकिन क्या तुम सच में एक धागा बनाने के अलावा अन्य बहुत कोड नहीं दिखाया - उदाहरण के लिए, आप नहीं धागा अपने दूसरे कोड ब्लॉक में शुरू कर दिया है।

यदि आप उस स्थान पर Dispatcher.Invoke कोड डालते हैं जहां पहले आपको InvalidOperationException मिल रहा था, तो यह ठीक होना चाहिए।

BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += (s, e) => 
    { 
    }; 
    bw.RunWorkerCompleted += (s, e) => 
    { 
    }; 
    bw.RunWorkerAsync(); 

सबसे अधिक उपयोगी होने के लिए:

+0

मैं आपके धैर्य की प्रशंसा करता हूं! मेरा मानना ​​है कि यह अजीब समय है जिसे पूछा गया है! – Manfred

+0

ठीक है, जॉन, मुझे पता है कि यह है, और मैंने उन अन्य प्रश्नों की खोज की है लेकिन मुझे वह जवाब नहीं मिला है जिसे मैं ढूंढ रहा था। मैं जा सकता हूं और प्रेषकों और धागे पर कई लिंक पढ़ सकता हूं, लेकिन सच्चाई यह है कि मुझे इसके लिए समय नहीं मिला है। मैंने दूसरों को सुझाव देने की कोशिश की, लेकिन यह काम नहीं करता है। @ जोन स्कीट: कोड के दूसरे ब्लॉक के धागे को शुरू करने वाला कोड स्प्रिंग.NET असेंबली में है। वे थ्रेड बनाते हैं जो एक एमएसएमक्यू कतार सुनते हैं और कस्टम एडाप्टर क्लास में एक विधि ट्रिगर करते हैं। इस कक्षा में मैं एक टेक्स्टबॉक्स अपडेट करना चाहता हूं। –

+2

@Lieven: वास्तव में, वास्तव में मदद मिलेगी यदि आप एक छोटा लेकिन पूरा प्रोग्राम तैयार करेंगे जो समस्या का प्रदर्शन करता है। आप अच्छी तरह से पाते हैं कि ऐसा करके, आपको समस्या स्वयं मिलती है। पूरे कार्यक्रम को स्प्रिंग इत्यादि से निपटने की आवश्यकता नहीं है - बस एक थ्रेड बनाएं जो नियमित रूप से UI को अपडेट करता है, या ऐसा कुछ। 'डिस्पैचर' * का उपयोग करना * यहां जवाब है - लेकिन हम यह नहीं बता सकते कि आप जो कोड दिखाए गए हैं उसके भीतर आप क्या कर रहे हैं। –

0

WPF के लिए, मैं इस संरचना पाते हैं। RunWorker पूर्ण ब्लॉक आमतौर पर एक ObservableCollection अद्यतन या RaisePropertyChangedEvent बंद आग लग जाएगा।

संबंधित मुद्दे