मैं पृष्ठभूमि में कोई काम करने का एक आसान तरीका ढूंढ रहा हूं, फिर पूरा होने पर कुछ (मुख्य धागे पर) अपडेट करें। यह निम्न स्तर के 'मॉडल' वर्ग में है, इसलिए मैं InvokeOnMainThread को कॉल नहीं कर सकता क्योंकि मेरे पास एनएसओब्जेक्ट नहीं है।सी # सरल पृष्ठभूमि धागा
public void GetItemsAsync(Action<Item[]> handleResult)
{
Item[] items=null;
Task task=Task.Factory.StartNew(() =>
{
items=this.CreateItems(); // May take a second or two
});
task.ContinueWith(delegate
{
handleResult(items);
}, TaskScheduler.FromCurrentSynchronizationContext());
}
यह ठीक से काम करने लगता है, लेकिन
1) यह सबसे अच्छा (सरल) तरीका है: मैं इस विधि है?
2) मैं स्थानीय चर बारे में चिंतित हूँ:
Item{} items=null
क्या है कि गायब जब विधि रिटर्न से पहले पृष्ठभूमि धागा पूरा करता है बंद हो जाता है?
धन्यवाद।
धन्यवाद, सिद्धांत रूप में बेहतर है। कार्य चर yourClass.CreateItems (टोकन) को भी हटा सकते हैं। (टी => { }, TaskScheduler.FromCurrentSynchronizationContext()); दयालुता हमें "टास्कशेड्यूलर.प्रॉमकंटेंट सिंक्रनाइज़ेशन कॉन्टेक्स्ट()" की आवश्यकता है। मैं ग्राहक के लिए सरल संभव एपीआई चाहते हैं तो इसके लिए या तो: 1) yourClass.GetItemsAsync (प्रतिनिधि (मद [] आइटम) {\t // आइटम के साथ कुछ करो}); या 2) yourClass.CreateItems (।) ContinueWith (टी => { // t.Result साथ कुछ करो}, TaskScheduler.FromCurrentSynchronizationContext()); तो मुझे अभी भी GetItemsAsync विधि वास्तव में चाहिए। – Bbx
हाँ, आप सही हैं। लेकिन OO सिद्धांतों और कार्य-आधारित प्रोग्रामिंग के संदर्भ में GetItemsAsync पिछले समाधान की तुलना में अधिक स्पष्ट है। उदाहरण के लिए, प्रस्तावित तकनीक का उपयोग करना सी # 5.0 की प्रतीक्षा/एसिंक सुविधाओं का इंतजार करना बहुत आसान होगा। ओओपी के मामले में यह समाधान अधिक सरल है क्योंकि यह पहिया का आविष्कार करने की कोशिश नहीं कर रहा है। और एक टेस्टेबिलिटी को न भूलें: इस मामले में आप आसानी से इस कार्य को नकली कार्यान्वयन से प्राप्त कर सकते हैं और क्लाइंट कोड के किसी कोने केस का परीक्षण कर सकते हैं। –