2015-05-06 48 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