c# - 如何创建一个只执行一次的方法?

标签 c#

在我的程序中,有一个带有“打印收据”按钮的屏幕;单击按钮时,我需要调用一个方法一次且仅一次。目前,用户可以打印多张收据,但我不知道有什么方法可以防止这种情况发生。

private async void PrintReceipt() 
{
    await _printReceiptInteractor.PrintTerminalReceiptAsync(_receipt).ConfigureAwait(false);
    Dispatcher.Dispatch(() => { this.Close(); });
}

如何强制执行仅执行此方法一次的要求?

更新:我设法通过添加 IsBusy 属性和一个在那里设置 IsBusy 的方法来解决此问题,然后调用该方法,然后我在 finally 中将 IsBusy 设置为 false ,因为我使用try and catch 语句。

最佳答案

您需要禁用调用您的方法的 GUI 控件,或者您需要创建一个属性(例如 bool)来跟踪您的方法的条目。

private bool _executed = false;
private void Method()
{
    if(!_executed)
    {
        _executed = true;
        // ...
    }
}

private readonly Button _button = new Button();
private void Method()
{
    _button.Enabled = false;
    // ...
}

private readonly object _lockObj = new object();
private void Method()
{
    // Prevent concurrent access
    lock(_lockObj)
    {
        if(!_executed)
        {
            _executed = true;
            // ...
        }
    }
}

关于c# - 如何创建一个只执行一次的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38519433/

相关文章:

C#,如何简单地改变类成员的顺序

c# - .NET 和 P2P - 编写 P2P 信使

c# - Entity Framework - 一对多 - 从两个表中选择

c# TCP/IP 服务器和客户端

c# - Azure 表存储查询从错误分区返回数据?

c# - 将多边形切成 n block

c# - 无法在同一 block 中启用已禁用的控件

C#泛型和继承

c# - 我有一个索引列表来标记要插入到 DataTable 的位置,如何在插入时进行迭代而不弄乱位置?

c# - 什么是 Microsoft.Web.Services2.dll