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 } 这不起作用.因为匿名方法没有相同的引用.因此第一行不会取消注册已注册的处理程序.最后,第二行为点击添加了额外的事件处理程序. 我需要使用哪种语法来添加和删除异步事件处理程序? 谢谢你的任何建议. 解决方法
与常规事件处理程序一起使用的语法相同.您需要将委托保存在某处,以便以后可以取消注册: 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"); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |