首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从EventHandler中删除EventHandler时出现的问题

从EventHandler中删除EventHandler时出现的问题
EN

Stack Overflow用户
提问于 2013-04-13 02:23:54
回答 3查看 122关注 0票数 2

我向一个事件添加了一个方法,但现在想在某些条件下删除在这些事件上运行的方法:

代码语言:javascript
复制
public MyClassConstructor()
{
    otherClassObj.OnMyDataReceived += new EventHandler(analyzeValues);
}
private void analyzeValues(object sender, EventArgs e)
{
    // finished analysis
    otherClassObj.OnMyDataReceived -= analyzeValues;
}

这似乎会使程序崩溃,但我不明白为什么。这是我的第一个C#程序。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2013-04-13 02:27:33

确保您的事件访问器为written aproprately。它应该看起来像这样:

代码语言:javascript
复制
private EventHandler onMyDataReceived;
public event EventHandler OnMyDataReceived
{
    add
    {
        lock (OnMyDataReceived)
        {
            onMyDataReceived += value;
        }
    }
    remove
    {
        lock (OnMyDataReceived)
        {
            onMyDataReceived -= value;
        }
    }
}

另外,考虑使用下面的代码来添加事件处理程序:

代码语言:javascript
复制
otherClassObj.OnMyDataReceived += analyzeValues;
票数 2
EN

Stack Overflow用户

发布于 2013-04-13 02:40:12

也许你的问题在于你举办活动的方式?您必须首先将事件背后的当前委托复制到局部变量,然后检查它是否为空,然后才调用它。如下所示:

代码语言:javascript
复制
var omdr = OnMyDataReceived;
if (omdr != null)
    omdr(this, new EventArgs());
票数 2
EN

Stack Overflow用户

发布于 2013-04-13 02:33:02

以下应用程序演示了如何订阅和取消订阅事件。您可以将此代码放入新的控制台应用程序中以运行它。

它显示第一次引发事件时,事件处理程序将被调用,然后取消订阅自身。第二次,不再订阅任何处理程序,并且什么也不会发生。

代码语言:javascript
复制
using System;
class Program
{

    static void Main(string[] args)
    {
        MyClass c = new MyClass();
        Console.WriteLine("Ready..");
        Console.ReadLine();
    }
}

public class MyClass
{
    OtherClass otherClassObj = new OtherClass();

    public MyClass()
    {
        Console.WriteLine("Class constructor.. adding event");
        otherClassObj.OnMyDataReceived += analyzeValues;

        Console.WriteLine("Raising event 1");
        otherClassObj.Raise();

        Console.WriteLine("Raising event 2");
        otherClassObj.Raise();
    }

    private void analyzeValues(object sender, EventArgs e)
    {
        Console.WriteLine("Event handler");
        Console.WriteLine("Removing event");
        otherClassObj.OnMyDataReceived -= analyzeValues;
    }
}

public class OtherClass
{
    public event EventHandler OnMyDataReceived;

    public void Raise()
    {
        if (OnMyDataReceived != null)
        {
            OnMyDataReceived(this, EventArgs.Empty);
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15978331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档