是否可以从事件中取消订阅匿名方法?
如果我订阅这样的事件:
void MyMethod()
{
Console.WriteLine("I did it!");
}
MyEvent += MyMethod;
Run Code Online (Sandbox Code Playgroud)
我可以这样取消订阅:
MyEvent -= MyMethod;
Run Code Online (Sandbox Code Playgroud)
但是如果我使用匿名方法订阅:
MyEvent += delegate(){Console.WriteLine("I did it!");};
Run Code Online (Sandbox Code Playgroud)
是否有可能取消订阅这种匿名方法?如果是这样,怎么样?
说如果我听一个事件:
Subject.NewEvent += delegate(object sender, NewEventArgs e)
{
//some code
});
Run Code Online (Sandbox Code Playgroud)
现在我如何取消注册此活动?或者只是让内存泄漏?
有人向我提到c#支持使用lambda表达式作为事件处理程序,有人可以与我分享一些参考吗?
代码段是首选.
可能重复:
C#添加和删除匿名事件处理程序
假设我有一个以这种方式声明的Action委托:
public event Action<MenuTraverser.Actions> menuAction;
Run Code Online (Sandbox Code Playgroud)
我正在以这种方式关联一个方法:
menuInputController.menuAction += (MenuTraverser.Actions action) => this.traverser.OnMenuAction(action);
Run Code Online (Sandbox Code Playgroud)
现在,一切正常,但在某些情况下我需要删除委托方法,我不知道如何.我试过这种方式,但不起作用:
menuInputController.menuAction -= (MenuTraverser.Actions action) => this.traverser.OnMenuAction(action);
Run Code Online (Sandbox Code Playgroud)
我该怎么办?我需要我的方法OnMenuAction将不再被调用.
我在找出一种取消订阅的方法时遇到了一些麻烦,这种方法取消了我在预先制作的帮助文件中发现的一些匿名委托事件,这些文件有助于在运行时移动控件.我想取消订阅这些事件的原因是控件(在这种情况下是按钮)将再次被锁定而无法移动.这是helper类中的方法:
public static void Init(Control control)
{
Init(control, Direction.Any);
}
public static void Init(Control control, Direction direction)
{
Init(control, control, direction);
}
public static void Init(Control control, Control container, Direction direction)
{
bool Dragging = false;
Point DragStart = Point.Empty;
control.MouseDown += delegate(object sender, MouseEventArgs e)
{
Dragging = true;
DragStart = new Point(e.X, e.Y);
control.Capture = true;
};
control.MouseUp += delegate(object sender, MouseEventArgs e)
{
Dragging = false;
control.Capture = false;
};
control.MouseMove += delegate(object sender, MouseEventArgs e)
{ …Run Code Online (Sandbox Code Playgroud) 我想创建一个Reactive Observable,它可以同时观察Renamed和。Changed
我正在监视文件夹中是否有已修改和重命名的文件FileSystemWatcher。我只想在事件稳定下来后处理该事件(因为有时Changed事件可能会引发多次)。所以我选择Throttle.net的功能Reactive Extension。
我可以通过观察单个Changed事件来完成这项工作,但无法弄清楚如何Changed在Renamed单个Observable.
这是我为单个Changed事件所做的事情:
var watcher = new FileSystemWatcher();
watcher.Path = "d:\\test";
var observable = Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>(
ev => watcher.Changed += ev,
ev => watcher.Changed -= ev
);
var d = observable.Throttle(TimeSpan.FromSeconds(5))
.Subscribe(
a => Console.WriteLine($"Watcher type:{a.EventArgs.ChangeType }, file:{a.EventArgs.Name }, sender: {a.Sender}"),
ex => Console.WriteLine("observer error:" + ex.ToString()),
() => Console.WriteLine("observer complete.")
);
Run Code Online (Sandbox Code Playgroud)
但是当我想观看这两个事件时,VS 告诉我 …