c# 事件被调用两次

c# event invoked twice

我有一个接收文件的服务器。接收文件后,调用一个事件。 它的工作原理是这样的:

public void Receive() {
    // do some file receiving 
    // decrypt received file
    // save file

    // when file is received decrypted and saved, invoke event:   
    OnFileReceived?.Invoke(this, fileName);

}

...

public static event EventHandler<string>? OnFileReceived;


我在其他 class 的构造函数中订阅了此事件,因此它会启动一个打开文件资源管理器的方法。只有一个实例 class,所以我很确定该事件应该只调用一次。

public Foo {
   // constructing object
   // subscribing to events:
   Server.OnFileReceived -= OnFileDownloaded;
   Server.OnFileReceived += OnFileDownloaded;
}

...

 private void OnFileDownloaded(object? sender, string filename)
        {
            InfoLabel = "Received: " + filename;
            OpenDirectory();
        }

问题是文件资源管理器被打开了两次。我做了一点调查,结果发现由于某种原因我的事件在 Receive() 方法中被调用了两次.这让我发疯。

我试图通过向 OnFileDownloaded 方法添加一个简单的布尔值来解决这个问题:

private void OnFileDownloaded(object? sender, string filename)
        {
            if (!_isInvoked)
            {
                _isInvoked = true;
                InfoLabel = "Received: " + filename;
                OpenDirectory(); // then setting here _isInvoked back to false after closing the File explorer
            }
        }

但是没有用。我也试过找到 here and here 的解决方案,更改事件声明:

private EventHandler<string> fileReceived;
public event EventHandler<string> OnFileReceived
{
    add
    {
        if (fileReceived == null || !fileReceived.GetInvocationList().Contains(value))
        {
            fileReceived += value;
        }
    }
    remove
    {
        fileReceived -= value;
    }
}

再次,没有运气。 问题是:如何防止这种情况发生?

谢谢。

正如评论中的先生们所建议的,我的问题是由两次调用 Foo 的构造函数引起的,这导致了两个单独的 Foo 对象。由于该事件已在上述构造函数中订阅...我又多了一位订阅者。

我很确定情况并非如此,因为我搜索了代码以寻找另一个调用 Foo 的构造函数:new Foo(),并找到了 nothing。我的致命错误是假设我与调用构造函数的方式一致...

然后在代码深处的某处我发现了这一行:

private Foo? _viewModel = new();

糖吃多了会坏牙,语法糖吃多了会发疯。经验教训:保持连贯