2012-08-14 22 views
6

मैं कार्य का उपयोग करने की कोशिश कर रहा हूं। कई कार्यों के पूरा होने का इंतजार करने के लिए सभी।कार्य का उपयोग कैसे करें। जब सभी() सही ढंग से

मेरा कोड नीचे है - यह एकाधिक एसिंक कार्यों को लॉन्च करना है, जिनमें से प्रत्येक बस मार्ग को पुनर्प्राप्त करता है और फिर उन्हें स्थानीय सरणी में जोड़ता है। हालांकि, कार्य। जब सभी (...) तुरंत लौटते हैं, और स्थानीय मार्ग सरणी की गिनती शून्य होती है। यह अजीब लगता है, क्योंकि मैं प्रत्येक कार्य के भीतर विभिन्न 'प्रतीक्षा' बयानों की अपेक्षा करता हूं कि प्रवाह निलंबित हो गया है, और कार्य समाप्त होने तक वापस नहीं आता है।

 List<Task> monitoredTasks = new List<Task>(); 
     foreach (BusRouteIdentifier bri in stop.services) 
     { 
      BusRouteRequest req = new BusRouteRequest(bri.id); 

      // Start a new task to fetch the route for each stop 
      Task getRouteTask = Task.Factory.StartNew(async() => 
      { 
       var route = await BusDataProviderManager.DataProvider.DataBroker.getRoute(req); 

        // Add the route to our array (on UI thread as it's observed) 
        await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, delegate 
        { 
         this.routes.Add(route); 
        }); 
      }); 

      // Store the task in our monitoring list 
      monitoredTasks .Add(getRouteTask); 
     } 

     Debug.WriteLine("Awaiting WHENALL"); 
     await Task.WhenAll(monitoredTasks); 
     Debug.WriteLine(string.Format("WHENALL returned (routes count is {0} ", this.routes.Count)); 

     this.OnWillEndFetchingRoutes(new EventArgs()); 

मैं स्पष्ट रूप से कुछ गलत कर रहा हूं - लेकिन क्या?

+0

आप चाहे अंतिम 'Task' गलती की स्थिति में नहीं है की जाँच की कोशिश की है के लिए धन्यवाद:

प्राप्त करने के लिए मैं चाहता था, मैं इस प्रकार refactor करने की जरूरत? –

+0

मुझे लगता है कि यह फ़ोरैच लूप के अंदर कुछ गलत 'प्रेषक का इंतजार' हो सकता है। यूआई थ्रेड तुरंत मनाया जाएगा और प्रदर्शित होगा? –

+0

@ie। हां, इसका राज्य RanToCompletion है। सरणी में सभी कार्यों की स्थिति RanToCompletion भी है, हालांकि जब मैं वास्तव में उन्हें व्यक्तिगत रूप से निरीक्षण करता हूं, तो प्रत्येक का परिणाम क्षेत्र प्रतीक्षा कर रहा है। सक्रियता –

उत्तर

6

यह कैसे async-का इंतजार है वास्तव में काम करता है की समझ की बुनियादी कमी के नीचे था।

आंतरिक कार्य बाहरी कार्य में प्रवाह लौट रहा था, जो तब लौटने की प्रतीक्षा से पहले समाप्त हो गया था।

 List<Task<BusRoute>> routeRetrievalTasks = new List<Task<BusRoute>>(); 
     foreach (BusRouteIdentifier bri in stop.services) 
     { 
      BusRouteRequest req = new BusRouteRequest(bri.id); 
      routeRetrievalTasks.Add(BusDataProviderManager.DataProvider.DataBroker.getRoute(req)); 
     } 

     foreach (var task in routeRetrievalTasks) 
     { 
      var route = await task; 
      this.routes.Add(route); // triggers events 
     } 

Dave Smits

5

मुझे संदेह है कि समस्या Task.Factory.StartNew() पर आपकी कॉल है। मुझे संदेह है कि आप Task<Task> के साथ समाप्त हो रहे हैं, और आप केवल तभी खोज रहे हैं जब यह प्रभावी ढंग से कार्य कार्य शुरू हुआ।

बजाय इस प्रयास करें:

Func<Task> taskFunc = async() => 
{ 
    var route = await BusDataProviderManager.DataProvider.DataBroker.getRoute(req); 

    // Add the route to our array (on UI thread as it's observed) 
    await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, delegate 
    { 
     this.routes.Add(route); 
    }); 

} 

Task getRouteTask = Task.Run(taskFunc); 
+0

धन्यवाद। मुझे लगता है कि मेरी बाकी विधि पहले की तरह जारी रहेगी, यानी कार्यों की सरणी में कार्य जोड़ें, फिर सरणी पर कार्य करें। जब सभी (...)। इस मामले में, यह दृष्टिकोण मेरे उत्तर में किसी से तुलना कैसे करता है? क्या कोई फायदे हैं? –

+0

@ करलोसपी: ईमानदार होने के लिए मेरे पास वास्तव में टिप्पणी करने के लिए पर्याप्त संदर्भ नहीं है जिस पर एक बेहतर दृष्टिकोण है। लेकिन हाँ, आपकी बाकी विधि पहले की तरह जारी रहेगी। –

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