How to wait until await / async methods finish

前端 未结 2 1313
面向向阳花
面向向阳花 2021-01-13 18:27

I have the following Async method:

private async void ProcessSearch()
{
    // get catalogs on first search
    if (_invoiceTypes == null && _invoice         


        
2条回答
  •  囚心锁ツ
    2021-01-13 19:14

    Minor changes to what you've got there will do what you want. You can start new tasks and then do other stuff and then await just before you go on. As @Noseratio has helpfully pointed out, this snippet below isn't production-ready because I'm not checking for error conditions (like null references, etc). The point is that you can succinctly and elegantly do these things in parallel without having to resort to using very much of the Tasks API. One adjustment I made worth pointing out is that you want to move the calls to Dispose into the continuation (i.e., after all your awaits) because if you try to Dispose right after calling the *Async methods you stand a good chance of killing off your WCF clients halfway through getting a response and the awaits will probably wind up throwing exceptions (which I'm not catching).

    private async void ProcessSearchAsync()
    {
    
        Data.ConfigurationWCF confWcf = new Data.ConfigurationWCF();
        Task t1;
        Task t2;
    
        // get catalogs on first search
        if (_invoiceTypes == null && _invoiceAccounts == null)
        {
            t1 = confWcf.GetInvoiceTypesAsync(MainForm.State.Entity);
            t2 = confWcf.GetInvoiceAccountsAsync(MainForm.State.Entity);
        }
    
        DataSeekWCF seekWcf = new DataSeekWCF();
        Task t3 = seekWcf.SearchInvoiceAdminAsync(new Guid(cboEmployer.Value.ToString()), new Guid(cboGroup.Value.ToString()), txtSearchInvoiceNumber.Text, chkSearchLike.Checked, txtSearchFolio.Text, Convert.ToInt32(txtYear.Value));
    
        _invoiceTypes = await t1;
        _invoiceAccounts = await t2;
        _ds = await t3;
    
        if (_ds != null)
        {
            SetupInvoiceGrid();
        }
    
        confWcf.Dispose();
        seekWcf.Dispose();
    }
    

提交回复
热议问题