0

クリックイベントでサーバーからデータを取得してグリッドに表示するボタンがあります。

コードは次のようになります。

private void btnSearch_Click(object sender, EventArgs e)
{
    // Here I should do something in order to know if the async ProcessSearch method is busy..
    // if not busy then I will execute it if not then I will return.
    // shows loading animation
    ShowPleaseWait(Translate("Searching data. Please wait..."));
    ProcessSearch();
}

private async void ProcessSearch()
{
    Data.SeekWCF 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();
    }
    // hides the loading animation
    HidePleaseWait();
}

非同期メソッド ProcessSearch がビジー状態か実行中かを知るにはどうすればよいですか。これにより、ユーザーがボタンを再度クリックしたときにメソッドが再度実行されるのを防ぐことができます。

4

1 に答える 1

4

ブール値を設定するだけです:

private bool isSearching = false;

private void btnSearch_Click(object sender, EventArgs e)
{
    if (isSearching)
        return;
    // shows loading animation
    ShowPleaseWait(Translate("Searching data. Please wait..."));
    ProcessSearch();
}

private async void ProcessSearch()
{
    isSearching = true;

    // do other stuff

    isSearching = false;
}

同時実行性が気になる場合は、次を追加できますlock

private bool isSearching = false;
private object lockObj = new object();

private void btnSearch_Click(object sender, EventArgs e)
{
    lock (lockObj)
    {
        if (isSearching)
            return;
        else
            isSearching = true;
    }
    // shows loading animation
    ShowPleaseWait(Translate("Searching data. Please wait..."));
    ProcessSearch();
}

private async void ProcessSearch()
{
    // do other stuff

    isSearching = false;
}
于 2013-08-17T16:48:44.963 に答える