加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何取消注册和注册一个等待的事件处理程序?

发布时间:2020-12-15 08:18:42 所属栏目:百科 来源:网络整理
导读:在我的代码中,我需要取消注册并注册一个事件处理程序,这非常有效: _favoritsImageView.Click -= _favoritsImageView_Click(this,new CustomeClickEventArgs(item));_favoritsImageView.Click += _favoritsImageView_Click(this,new CustomeClickEventArgs(i
在我的代码中,我需要取消注册并注册一个事件处理程序,这非常有效:
_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
}

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

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

_favoritsImageView.Click += async (s,new CustomeClickEventArgs(item)); };

async Task _favoritsImageView_ClickAsync(object sender,CustomeClickEventArgs e)
{
       // does async task
}

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

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

谢谢你的任何建议.

解决方法

Which syntax do I need to use to add and remove an async event
handler?

与常规事件处理程序一起使用的语法相同.您需要将委托保存在某处,以便以后可以取消注册:

private EventHandler eventHandler = 
                            new EventHandler(async (s,e) => await FooAsync(s,e));

public async void SomeOtherEventHandler()
{
    var m = new M();
    m.X += eventHandler;
    m.OnFoo();
    m.X -= eventHandler;
    m.OnFoo();
}

public async Task FooAsync(object sender,EventArgs e)
{
    await Task.Delay(1000);
    Debug.WriteLine("Yay event handler");
}

public class M
{
    public event EventHandler X;
    public void OnX()
    {
        // If you're using C#-6,then X?.Invoke(null,EventArgs.Empty);

        var localX = X;
        if (localX != null)
            localX(null,EventArgs.Empty);
    }
}

编辑:

@svick建议或许另一个解决方案,简单地使方法async void并直接注册它,这肯定更短:

public async void SomeOtherEventHandler()
{
    var m = new M();
    m.X += FooAsync;
    m.OnFoo();
    m.X -= FooAsync;
    m.OnFoo();
}

public async void FooAsync(object sender,EventArgs e)
{
    await Task.Delay(1000);
    Debug.WriteLine("Yay event handler");
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读