相关疑难解决方法(0)

如何删除lambda事件处理程序

可能重复:
在C#中取消订阅匿名方法
如何取消注册"匿名"事件处理程序

我最近发现我可以使用lambdas来创建简单的事件处理程序.我可以订阅像这样的点击事件:

button.Click += (s, e) => MessageBox.Show("Woho");
Run Code Online (Sandbox Code Playgroud)

但你怎么取消订阅呢?

c# events lambda event-handling

223
推荐指数
1
解决办法
8万
查看次数

添加和删​​除匿名事件处理程序

我想知道这是否真的有效?

private void RegisterKeyChanged(T item) 
{
    item.OnKeyChanged += (o, k) => ChangeItemKey((T)o, k);
}

private void UnRegisterKeyChanged(T item) 
{
    item.OnKeyChanged -= (o, k) => ChangeItemKey((T)o, k);
}
Run Code Online (Sandbox Code Playgroud)

编译器如何知道事件处理程序是否相同?这甚至是推荐的吗?

c# events anonymous-methods

54
推荐指数
3
解决办法
4万
查看次数

与lambdas一起使用的弱事件处理程序模型

好吧,所以这更像是一个答案而不是一个问题,但在提出这个问题之后,将Dustin Campbell,Egor的各个部分以及" IObservable/Rx/Reactive框架 "中的最后一个提示拉到一起,我想我为这个特殊问题制定了可行的解决方案.它可能会被IObservable/Rx/Reactive框架完全取代,但只有经验才会显示出来.

我故意创造了一个新问题,给我空间来解释我如何得到这个解决方案,因为它可能不会立即显而易见.

有很多相关的问题,大多数人告诉你,如果你想以后能够分离它们,你就不能使用内联lambda:

确实,如果希望以后能够分离它们,您需要保留对lambda的引用.但是,如果您只是希望事件处理程序在订阅者超出范围时自行分离,则此答案适合您.

.net c# events lambda memory-leaks

38
推荐指数
2
解决办法
1万
查看次数

如何取消注册"匿名"事件处理程序

说如果我听一个事件:

Subject.NewEvent += delegate(object sender, NewEventArgs e)
{
    //some code
}); 
Run Code Online (Sandbox Code Playgroud)

现在我如何取消注册此活动?或者只是让内存泄漏?

.net c# events delegates anonymous-methods

37
推荐指数
4
解决办法
2万
查看次数

如何取消订阅使用lambda表达式的事件?

我有以下代码让GUI响应集合中的更改.

myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());
Run Code Online (Sandbox Code Playgroud)

首先,这是一个很好的方法吗?

第二:取消订阅此活动的代码是什么?它是相同的但是 - =(然后又是完整的匿名方法)?

.net c# lambda event-handling c#-3.0

26
推荐指数
2
解决办法
1万
查看次数

通过匿名代表取消订阅活动

我使用Resharper 5.1代码分析很多次我从resharper得到一个评论

"通过匿名代表取消订阅"

#Part of Code  

if (((bool)e.NewValue))
{
    listView.PreviewTextInput += (o,args) =>
        listView_PreviewTextInput(o,args,listView);
}
else
{
    listView.PreviewTextInput -= (o, args) => 
        listView_PreviewTextInput(o, args, listView);
}
Run Code Online (Sandbox Code Playgroud)

我怎么能纠正或优化这件事

c# wpf attachedbehaviors

17
推荐指数
2
解决办法
5600
查看次数

为什么我不能使用Lambda表达式取消订阅事件?

本文说明您无法使用Lambda表达式取消订阅事件.

例如,您可以订阅如下:

d.Barked += (s, e) => Console.WriteLine("Bark: {0}", e);
Run Code Online (Sandbox Code Playgroud)

但是你不能这样取消订阅:

d.Barked -= (s, e) => Console.WriteLine("Bark: {0}", e); 
Run Code Online (Sandbox Code Playgroud)

为什么?这与代表取消订阅有什么区别,例如

EventHandler<string> handler = (s, e) => Console.WriteLine("Bark: {0}", e);
d.Barked += handler;

// ...

d.Barked -= handler;
Run Code Online (Sandbox Code Playgroud)

c# lambda

15
推荐指数
1
解决办法
2642
查看次数

使用匿名委托进行事件处理时的垃圾收集

UPDATE

我将这里的各种答案结合到一个新问题的"确定"答案中.

原始问题

在我的代码中,我有一个事件发布者,它在应用程序的整个生命周期中都存在(这里简化为基本要素):

public class Publisher
{
    //ValueEventArgs<T> inherits from EventArgs
    public event EventHandler<ValueEventArgs<bool>> EnabledChanged; 
}
Run Code Online (Sandbox Code Playgroud)

因为这个发布者可以在所有地方使用,所以我对自己创建这个小帮助类非常满意,以避免在所有订阅者中重写处理代码:

public static class Linker
{
    public static void Link(Publisher publisher, Control subscriber)
    {
         publisher.EnabledChanged += (s, e) => subscriber.Enabled = e.Value;
    }

    //(Non-lambda version, if you're not comfortable with lambdas)
    public static void Link(Publisher publisher, Control subscriber)
    {
         publisher.EnabledChanged +=
             delegate(object sender, ValueEventArgs<bool> e)
             {
                  subscriber.Enabled = e.Value;
             };
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,直到我开始在较小的机器上使用它,当我偶尔开始:

System.ComponentModel.Win32Exception
Not enough storage is available to process …
Run Code Online (Sandbox Code Playgroud)

c# garbage-collection event-handling

13
推荐指数
2
解决办法
1万
查看次数

删除匿名事件处理程序

可能重复:
C#:如何删除lambda事件处理程序

是否可以删除作为匿名函数附加的事件处理程序?假设我有一个事件,我以这种方式订阅它:

TestClass classs = new TestClass ();
classs.myCustomEvent +=  (a,b) => { Console.Write(""); };
Run Code Online (Sandbox Code Playgroud)

有可能以某种方式使用 - = ??删除此eventHandler

c# events event-handling

11
推荐指数
1
解决办法
3328
查看次数

如何取消注册并注册一个等待的事件处理程序?

在我的代码中,我需要取消注册并注册一个事件处理程序,这非常有效:

_favoritsImageView.Click -= _favoritsImageView_Click(this, new CustomeClickEventArgs(item));
_favoritsImageView.Click += _favoritsImageView_Click(this, new CustomeClickEventArgs(item));
void _favoritsImageView_Click(object sender, CustomeClickEventArgs e)
{
       // handles the event
}
Run Code Online (Sandbox Code Playgroud)

但对于一个等待的事件处理程序,我必须使用以下语法:

_favoritsImageView.Click -= async (s, e) => 
{ await _favoritsImageView_ClickAsync(s, new CustomeClickEventArgs(item)); };

_favoritsImageView.Click += async (s, e) => 
{ await _favoritsImageView_ClickAsync(s, new CustomeClickEventArgs(item)); };

async Task _favoritsImageView_ClickAsync(object sender, CustomeClickEventArgs e)
{
       // does async task
}
Run Code Online (Sandbox Code Playgroud)

这不起作用.因为匿名方法没有相同的引用.因此第一行不会取消注册已注册的处理程序.最后,第二行为点击添加了额外的事件处理程序.

我需要使用哪种语法来添加和删除异步事件处理程序?

谢谢你的任何建议.

c# events async-await

6
推荐指数
2
解决办法
1721
查看次数