2013-04-09 6 views
5

मैं एक साधारण कोड [डब्ल्यूपीएफ सी #] के साथ पागल हो रहा हूं जिसमें मैं मूल संचालन को स्वचालित करने के लिए पृष्ठभूमिवर्कर का उपयोग करता हूं। क्या मुझे क्लिपबोर्ड पर एक सामग्री जोड़नी चाहिए।पृष्ठभूमिवर्कर और क्लिपबोर्ड

BackgroundWorker की विधि में इस कोड को क्रियान्वित करने के बाद:

Clipboard.SetText (splitpermutation [i]); 

मैं एक त्रुटि है कि धागा बताते एसटीए होना चाहिए मिलता है, लेकिन मैं कैसे करना है समझ में नहीं आता। यहाँ अधिक कोड: (सभी नहीं)

private readonly BackgroundWorker worker = new BackgroundWorker(); 

private void btnAvvia_Click(object sender, RoutedEventArgs e) 
{ 
      count = lstview.Items.Count; 
      startY = Convert.ToInt32(txtY.Text); 
      startX = Convert.ToInt32(txtX.Text); 
      finalY = Convert.ToInt32(txtFinalPositionY.Text); 
      finalX = Convert.ToInt32(txtFinalPositionX.Text); 
      incremento = Convert.ToInt32(txtIncremento.Text); 
      pausa = Convert.ToInt32(txtPausa.Text); 

      worker.WorkerSupportsCancellation = true; 
      worker.RunWorkerAsync(); 

      ... 
} 

private void WorkFunction(object sender, DoWorkEventArgs e) 
{ 
    [...] 
        if (worker.CancellationPending) 
        { 
         e.Cancel = true; 
         break; 
        } 
        else 
        { 
         [...] 
         Clipboard.SetText(splitpermutation[i]); 
         [...] 
        } 
} 

उत्तर

4

आप यूआई धागा को यह मार्शल सकता है यह काम करने के लिए: .NET थ्रेड पूल पर

else 
{ 
    [...] 
    this.Dispatcher.BeginInvoke(new Action(() => Clipboard.SetText(splitpermutation[i]))); 
    [...] 
} 
+0

डिस्पैचर कहां है? यह क्या है'? मुझे यह प्रतीत नहीं होता है। – codemann8

+0

@ कोडमैन 8 डब्ल्यूपीएफ में, प्रत्येक यूआई तत्व में डिस्पैचर होता है - यह –

+0

के पीछे कोड में था, मुझे डब्ल्यूपीएफ में कोई अनुभव नहीं है, मैं एक मानक विनफॉर्म सी # प्रोजेक्ट का उपयोग कर रहा हूं ... क्या वहां कोई समकक्ष समाधान है? – codemann8

1

BackgroundWorker चलाता है। थ्रेड पूल धागे COM बहु थ्रेडेड अपार्टमेंट में चलते हैं। क्लिपबोर्ड का उपयोग करने के लिए, आपको एक सिंगल थ्रेडेड अपार्टमेंट में चलना होगा। आप अपना खुद का धागा बना सकते हैं और इसे एसटीए में चलाने के लिए सेट कर सकते हैं, लेकिन उपयोगकर्ता-इंटरफ़ेस थ्रेड (जो एक एसटीए थ्रेड होना चाहिए) पर वापस जाने के लिए Control.Invoke (या BeginInvoke) का उपयोग करना संभवतः संभव होगा।

0

आपको जो अपवाद मिल रहा है वह है क्योंकि आप UI थ्रेड (BackgroundWorker के बाहर से यूआई थ्रेड पर कुछ करने की कोशिश कर रहे हैं, जैसा कि नाम का तात्पर्य है, पृष्ठभूमि में कुछ करता है, और इसके लिए इसे बनाने की आवश्यकता है एक अलग धागा)।

जबकि रीड द्वारा पोस्ट किया गया उत्तर (यानी, Dispatcher.BeginInvoke का उपयोग करके) इस अपवाद से बचने का एक तरीका है, मैं सोच रहा हूं कि आप मुख्य कार्य विधि से क्लिपबोर्ड पर कुछ जगह भेजने की कोशिश क्यों कर रहे हैं ...

BackgroundWorkerProgressChanged तरह की घटनाओं या RunWorkerCompleted (जो जब मुख्य कार्य पद्धति खत्म सक्रिय होगा) (जो आप अपने काम विधि से समय-समय पर कॉल कर सकते हैं) को उजागर करता है।

इन घटनाओं में से किसी एक में Clipboard.SetText का उपयोग करके आप जो अपवाद देख रहे हैं, उसका कारण नहीं होना चाहिए, और यह BackgroundWorker के साथ काम करते समय UI थ्रेड पर चीजों को करने का बेहतर तरीका प्रतीत होता है।

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