2015-05-06 75 views
-1

我有一個XAML應用程序,我正在做一些耗時的事情,我想異步地做一切,使一切更好。 起初我創建了一個連接到web服務的類的實例。在應用程序啓動後首先執行此操作並顯示「連接到webservice ...」等信息將會很好。
該類已實例化後,我從WebService獲取大量數據,然後它正在綁定並顯示在DataGrid。這是我想要在顯示ProgressBar時異步運行的第二項任務。
我瞭解了異步和等待的基礎知識,但我不知道如何在應用程序窗口可見後,我可以進一步使用它來獲取數據後,在異步方法中聲明該對象。任何幫助非常感謝!創建對象異步

這裏是一些演示代碼,顯示了我的項目目前的樣子。

public class ClassA 
{ 
    public void Connect 
    { 
     //Connect to WebService 
    } 

    public List GetObjectIds 
    { 
     //get object IDs 
    } 

    public objType GetObjectById 
    { 
     //get complete Object 
    } 
} 

public class MainWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent() 

     ClassA hello = new ClassA(); 
     //This takes about 15 seconds. Shall be async 
     hello.Connect(); 

     //List will be used as Source for DataGrid 
     List<object> DataGridViewSource List<object>(); 

     //use the instance of hello to get some Data from the WebService. 
     List<int> objectIds = new List<int>(); 
     objectIds = hello.GetObjectIds("LDAPQuery"); 

     foreach (int id in objectIds) 
     { 
      //this takes about 10 minutes. Shall be async 
      var tmpObj = hello.GetObjectById(id); 
      DataGridViewSource.Add(tmpObj); 
     } 

     //do binding to DataGrid 
    } 
} 
+0

我正確理解for循環應該異步運行嗎? – Domysee

+2

請比_更具體,「但我沒有任何運氣實現這個」_。請確實提供[一個很好的,_minimal_,_complete_代碼示例](http://stackoverflow.com/help/mcve),它可靠而清晰地說明了迄今爲止嘗試過的內容以及該嘗試的作用,並提供了清晰詳細的解釋爲什麼以及如何與您希望代碼執行的內容不同。 –

+0

你說得對。我編輯了我的問題。我的主要問題是在應用程序窗口可見後,如何以及在何處異步聲明對象。 – sevi

回答

1

你不能await異步代碼在構造函數,但你可以在一個事件。例如:Loaded,例如:

public MainWindow() 
{ 
    // At design time (in your XAML), initialize to the "Loading..." state 
    InitializeComponent() 
} 

private async void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    ClassA hello = new ClassA(); 
    await hello.ConnectAsync(); 

    //List will be used as Source for DataGrid 
    List<object> DataGridViewSource List<object>(); 

    //use the instance of hello to get some Data from the WebService. 
    List<int> objectIds = new List<int>(); 
    objectIds = hello.GetObjectIds("LDAPQuery"); 

    foreach (int id in objectIds) 
    { 
     var tmpObj = await hello.GetObjectByIdAsync(id); 
     DataGridViewSource.Add(tmpObj); 
    } 

    //do binding to DataGrid 
} 
+1

那麼這個事件處理程序中的異步操作就是一個fire and forget操作,如果你想通過調用,而不是等待或「等待」一個'async'方法,那麼你可以從構造函數中完成該操作。 – Servy

+0

@Servy:如果你接受沉默異常吞嚥,是的。 :) –

+0

如果您願意,您可以顯式處理異常,或者如果您確實需要相同的錯誤處理語義,則可以從構造函數中調用「async void」方法。 – Servy