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();
糖吃多了会坏牙,语法糖吃多了会发疯。经验教训:保持连贯。
我有一个接收文件的服务器。接收文件后,调用一个事件。 它的工作原理是这样的:
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();
糖吃多了会坏牙,语法糖吃多了会发疯。经验教训:保持连贯。