C#中的自定义事件特别是发送方对象是线程安全的

C#中的自定义事件特别是发送方对象是线程安全的,c#,.net,multithreading,thread-safety,C#,.net,Multithreading,Thread Safety,好的,我正在实现一组自定义事件。它们将主要用于多线程环境中,以在整个线程中交流主要成就。现在我有一个简单的设置: public delegate void TestEventHandler(object sender, TestEventArgs e); public class Test { bool _stopTesting = false; int _runs = 0; public event TestEventHandler Tester; pro

好的,我正在实现一组自定义事件。它们将主要用于多线程环境中,以在整个线程中交流主要成就。现在我有一个简单的设置:

public delegate void TestEventHandler(object sender, TestEventArgs e);

public class Test
{
    bool _stopTesting = false;
    int _runs = 0;

    public event TestEventHandler Tester;

    protected virtual void OnTest(TestEventArgs e)
    {
        TestEventHandler hand = Tester;
        if (hand != null)
            hand(this, e);
    }

    public void StartTest()
    {
        while (!_stopTesting)
        {
            _runs++;
            TestEventArgs e = new TestEventArgs(true, 100000);
            OnTest(e);
        }
    }
}

public class TestMe
{
    public void TestMeHard(object sender, TestEventArgs e)
    {
        Test check = sender as Test;
        Console.WriteLine(e.Message);
    }
}

事件args类在别处定义。我的问题是,
sender
对象是否线程安全,请原谅noobish的问题,
sender
对象是引用还是副本?与中一样,对发送方对象的任何更改是否会在触发事件的实际对象中被引用?

发送方对象是引用而不是副本

现在谈谈线程安全问题, 这取决于发送方参数中传递的对象。由于发送方对象是一般类型化的,因此需要将其类型化为适当的类型才能使用它。它可以表示任何对象,但很难说它是否线程安全


仔细阅读,了解如何编写线程安全类

,这样在上面的情况下,传递
this
关键字就不会是线程安全的?我认为不会。你还没有实现任何机制来保证线程安全。通过这个,将帮助你编写一个线程安全的类。我只是确保我做得正确而已。谢谢您提供的信息。发件人对象是一个引用。您可以通过将
手(this,e)
更改为类似
手(MakeACopyOf(this,e)
(但您为什么要这样做?)的方式来制作对象的副本。我想确保我的理解是正确的。