价值事件发生了变化

时间:2016-06-30 09:48:14

标签: c# multithreading events exception eventhandler

你好,我想知道为什么这段代码会让我成为例外。

namespace Test_Inotify
{
class Test_Onchange
{
    private int value;
    private object _lock = new object();
    /*removed private object _lock;*/

    public event System.EventHandler ValueChanged;

    protected virtual void OnValueChange()
    {
        lock (_lock)
        {
            if (ValueChanged != null)
                ValueChanged(this, EventArgs.Empty);
        }
    }

    public int Value
    {
        get { return this.value; }
        set
        { 
        this.value = value;
        OnValueChange();
        }
    }
}
}

表格

namespace Test_Inotify
{
public partial class Form1 : Form
{
    Test_Onchange ValueClass ;//ForceValue removed;

    public Form1()
    {
        InitializeComponent();
       /* Test_Onchange removed*/ ValueClass = new Test_Onchange();

        ValueClass.ValueChanged += new EventHandler(EventValueChanged);

        for (int i = 0; i < 10; i++)
        {
            Random Rndvalue = new Random();
            int RandVal = Rndvalue.Next(0, 100);
            ValueClass.Value = RandVal;
            System.Threading.Thread.Sleep(500);           
        }

    }
    private void EventValueChanged(object sender, EventArgs e)
    {
        int valueforce = ValueClass.Value; /*removedForceClass.Value;*/
        MessageBox.Show("Event raised"+valueforce);
    }
}
}

我认为它在EventValueChanged ....但我不修改值中的任何内容,我只将其复制到局部变量中。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

这个怎么样:

Test_Onchange ForceClass = new Test_Onchange();
ForceClass.ValueChanged += new EventHandler(EventValueChanged);

ForceClass.Value = RandVal;

为什么你有ForceClass和ValueClass?和ForceClass始终为NULL

答案 1 :(得分:0)

您正在创建一个类型为Test_Onchange的新对象

Test_Onchange ValueClass = new Test_Onchange();
ValueClass.ValueChanged += new EventHandler(EventValueChanged);

但是在这种情况下,您正在使用全局对象ForceClass。 您将获得NullReferenceException,因为您的ForeClass未实例化。 用以下代码替换您的代码:

ForeClass = new Test_Onchange();
ForeClass.ValueChanged += new EventHandler(EventValueChanged);

for (int i = 0; i < 10; i++)
{
    Random Rndvalue = new Random();
    int RandVal = Rndvalue.Next(0, 100);
    ForeClass.Value = RandVal;
    System.Threading.Thread.Sleep(500);           
}