2012-08-31 13 views
5

पर कर्सर अपडेट नहीं कर रहा है मैं एक WPF ऐप पर काम कर रहा हूं और मैं बस कार्य चलाने से पहले और बाद में कर्सर को बदलना चाहता हूं।कार्य जारी रखें() यूआई थ्रेड

this.Cursor = Cursors.Wait; 

Task.Factory.StartNew(() => PerformMigration(legacyTrackerIds)).ContinueWith(_ => this.Cursor = Cursors.Arrow); 

कर्सर वास्तव में इंतजार कर्सर में बदल जाती है, लेकिन जब काम किया जाता है यह तीर को वापस नहीं बदलता है: मैं इस कोड है। अगर मैं ContinueWith() विधि में ब्रेकपॉइंट डालता हूं, तो यह हिट हो जाता है। लेकिन कर्सर एक तीर पर वापस नहीं बदलता है। क्यूं कर?

यह पुराना तरीका था जिसकी मैं कोशिश कर रहा था। कर्सर वापस एक तीर में बदल गया, लेकिन मैं कार्य के लिए प्रतीक्षा() इंतजार नहीं करना चाहता।

this.Cursor = Cursors.Wait; 

Task.Factory.StartNew(() => PerformMigration(legacyTrackerIds)).Wait(); 

this.Cursor = Cursors.Arrow; 

उत्तर

10

कर्सर परिवर्तन UI थ्रेड पर करने की आवश्यकता है। आप overload of ContinueWith कि एक कार्य अनुसूचक लेता उपयोग कर सकते हैं:

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 

Task.Factory 
    .StartNew(() => PerformMigration(legacyTrackerIds)) 
    .ContinueWith(_ => this.Cursor = Cursors.Arrow, uiScheduler); 

या Dispatcher.Invoke विधि का उपयोग करें:

Task.Factory 
    .StartNew(() => PerformMigration(legacyTrackerIds)) 
    .ContinueWith(_ => { Dispatcher.Invoke(() => { this.Cursor = Cursors.Arrow; }); }); 
+0

क्या मुझे अपवाद नहीं मिलना चाहिए? –

+0

@BobHorn आप बहुत संभव हैं, लेकिन चूंकि यह पृष्ठभूमि धागे में है, यह केवल उस धागे को नीचे ला रहा है, न कि पूरे आवेदन। – Servy

+0

जब मैं पहला सुझाव आज़माता हूं, तो मुझे संकलन-समय त्रुटि मिलती है: '' सिस्टम। डिलीगेट 'टाइप करने के लिए लैम्ब्डा अभिव्यक्ति को परिवर्तित नहीं किया जा सकता क्योंकि यह एक प्रतिनिधि प्रकार नहीं है। –

2

मुझे लगता है कि आप सही तुल्यकालन संदर्भ उपयोग करने की आवश्यकता:

this.Cursor = Cursors.Wait; 

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext()); 

Task.Factory.StartNew(() => PerformMigration(legacyTrackerIds)) 
      .ContinueWith(_ => this.Cursor = Cursors.Arrow, uiScheduler); 
2

समस्या यह है कि निरंतरता को UI थ्रेड में चलाने की आवश्यकता है। वर्तमान में यह पृष्ठभूमि धागे में किया जा रहा है।

TaskScheduler.FromCurrentSynchronizationContext()ContinueWith के दूसरे पैरामीटर में इसे यूआई थ्रेड में चलाने के लिए जोड़ें।

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