0

我有一個ScheduledTaskAgent項目ScheduledAgent.cs中的oninvoke()方法調用自定義類庫項目中的fetchcurrentdetails()方法。如何等到所有的異步調用完成

在這個公共字符串fetchcurrentdetails()方法它有以下一系列事件。

  //class variables 
      string strAddress = string.empty; 
      public string fetchcurrentdetails() 
       { 
       GeoCoordinateWatcher watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High); 
       if (watcher.Permission == GeoPositionPermission.Granted) 
       { 
        watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);  
       } 
       return strAddress ; 
       } 

      private void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) 
      { 
      WebClient bWC = new WebClient();     
      System.Uri buri = new Uri("http://dev.virtual//..."); 
      bWC.DownloadStringAsync(new Uri(buri.ToString())); 
      bWC.DownloadStringCompleted += new     DownloadStringCompletedEventHandler(bHttpsCompleted); 
      } 


      private void bHttpsCompleted(object sender, DownloadStringCompletedEventArgs bResponse) 
       { 
      //do some data extraction and return the string 
      strAddress = "This is extracted data"; 
      } 

return語句總是空字符串返回到調用statement.Any知道如何確保執行類庫中保留,直到方法/事件bHttpsCompleted()完成?或者當事件/方法bHttpsCompleted()被觸發時,返回值的方式是什麼。

+0

我可以使這個工作,但快速的問題。何時抓取當前的細節被調用?這是一次性交易,你只是想獲得一個職位?或者你想不斷變換地理座標? –

+0

另外,你是在Windows Phone 7或Windows Phone 8之後? –

+0

我想開發這個應用程序的Windows Phone 7,也想確保它在Windows Phone 8中工作。目前我在這個Windows Phone 7項目中使用PeriodicTask,它只能每隔30分鐘觸發一次:-(當它觸發oninvoke()方法,此方法調用fetchcurrentdetails()方法作爲其第一條語句。從那裏我已經在我的文章中描述了代碼在類庫中的fetchcurrentdetails()方法中的樣子。如果我可以在地形座標變化時不斷捕捉地理座標事件,但我認爲在Windws phone7中不可能這樣做。 – krrishna

回答

2

您可以修改這樣

public Task<string> fetchcurrentdetails() 
    { 

     var tcs = new TaskCompletionSource<string>(); 

     GeoCoordinateWatcher watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High); 
     if (watcher.Permission == GeoPositionPermission.Granted) 
     { 
      watcher.PositionChanged += (s, e) => 
       { 
        WebClient bWC = new WebClient(); 
        System.Uri buri = new Uri("http://dev.virtual//..."); 
        bWC.DownloadStringAsync(new Uri(buri.ToString())); 
        bWC.DownloadStringCompleted += (s1, e1) => 
        { 

         if (e1.Error != null) tcs.TrySetException(e1.Error); 
         else if (e1.Cancelled) tcs.TrySetCanceled(); 
         else 
          tcs.TrySetResult(e1.Result); 
         //do some data extraction and return the string       
        }; 
       }; 
     } 
     return tcs.Task; 
    } 

電話:await fetchcurrentdetails()

+0

可以從http://www.nuget.org/packages/System.Threading.Tasks安裝system.threading.tasks – krrishna

+0

在調用.cs文件時,它顯示「無法找到async關鍵字所需的所有類型」 – krrishna

+0

通過安裝PM獲得解決:install-package Microsoft.Bcl.Async -pre – krrishna

-1

你應該從bHttpsCompleted函數中返回。

+0

控件不是等待bHttpsCompleted()方法完成。 – krrishna