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)
(但您为什么要这样做?)的方式来制作对象的副本。我想确保我的理解是正确的。