我有以下的異步方法:如何等到的await /異步方法完成
private async void ProcessSearch()
{
// get catalogs on first search
if (_invoiceTypes == null && _invoiceAccounts == null)
{
var confWcf = new Data.ConfigurationWCF();
_invoiceTypes = await confWcf.GetInvoiceTypesAsync(MainForm.State.Entity);
_invoiceAccounts = await confWcf.GetInvoiceAccountsAsync(MainForm.State.Entity);
confWcf.Dispose();
}
var seekWcf = new DataSeekWCF();
_ds = await seekWcf.SearchInvoiceAdminAsync(new Guid(cboEmployer.Value.ToString()), new Guid(cboGroup.Value.ToString()), txtSearchInvoiceNumber.Text, chkSearchLike.Checked, txtSearchFolio.Text, Convert.ToInt32(txtYear.Value));
seekWcf.Dispose();
if (_ds != null)
{
SetupInvoiceGrid();
}
}
我不想執行SetupInvoiceGrid直到_invoiceTypes,_invoiceAccounts和_ds已經完成。
任何線索?我做對了嗎?我應該使用任務而不是等待?
我想出了這個代碼,似乎是工作,看起來好像沒什麼問題,但真的不知道,如果它的正確:
private void btnSearch_Click(object sender, EventArgs e)
{
lock (lockObj)
{
if (_isBusy)
return;
else
_isBusy = true;
}
ShowPleaseWait(Translate("Searching data. Please wait..."));
if (_invoiceTypes == null && _invoiceAccounts == null)
{
var t = GetCatalogs();
t.ContinueWith(t2 =>
{
if (t.IsCompleted) ProcessSearch();
});
}
else
{
ProcessSearch();
}
}
private async Task GetCatalogs()
{
// get catalogs on first search
Data.ConfigurationWCF confWcf = new Data.ConfigurationWCF();
var task1 = confWcf.GetInvoiceTypesAsync(1);
var task2 = confWcf.GetInvoiceAccountsAsync(1);
confWcf.Dispose();
await Task.WhenAll(task1, task2);
_invoiceTypes = task1.Result;
_invoiceAccounts = task2.Result;
if (_invoiceTypes != null)
{
cboInvoiceType.DataSource = _invoiceTypes.Tables["invoice_types"];
cboInvoiceType.DisplayMember = "description";
cboInvoiceType.ValueMember = "code";
}
}
private async void ProcessSearch()
{
var seekWcf = new Data.SeekWCF();
_ds = await seekWcf.SearchInvoiceAdminAsync(new Guid(cboEmployer.Value.ToString()), new Guid(cboGroup.Value.ToString()), txtSearchInvoiceNumber.Text, chkSearchLike.Checked, txtSearchFolio.Text, Convert.ToInt32(txtYear.Value));
seekWcf.Dispose();
if (_ds != null)
{
SetupInvoiceGrid();
}
HidePleaseWait();
}
您是否嘗試過運行此操作以查看它是否有效?我看起來很好。 –
這工作..但我想例如並行運行GetInvoiceTypesAsync和GetInvoiceAccountsAsync與SearchInvoiceAdminAsync。所以3個飛蛾運行pararell,但我不能執行SetupInvoiceGrid,直到所有這些完成。 – VAAA