2013-05-03 57 views
0

好吧,所以我正在實現一組自定義事件。它們將主要用於多線程環境以在整個線程中傳達主要成就。現在我有這個簡單的設置:C#中的自定義事件特別是發件人對象線程安全

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對象是引用還是副本?因爲在發送對象的任何變化都會在觸發事件的實際對象中被重新引用嗎?

+0

發件人對象的引用。你可以通過把'hand(this,e)'改成'hand(MakeACopyOf(this),e)'(但你爲什麼要這樣做)來製作你的對象的副本。 – Artemix 2013-05-03 12:14:23

+0

我想確保我在理解中走在正確的道路上。 – Nomad101 2013-05-03 12:23:18

回答

1

發件人對象是引用而不是副本。

現在的線程安全問題, 它取決於在sender參數中傳遞什麼對象。由於發送者對象一般是流行的,因此需要將其轉換爲適當的類型才能使用它。它可以代表任何對象,如果線程安全或不安全,則很難說。

去走遍this瞭解如何編寫線程安全類

+0

所以在上面通過'this'關鍵字的情況下,它不會是線程安全的? – Nomad101 2013-05-03 12:06:57

+0

我不認爲這會是。您尚未實現任何機制來使其線程安全。 – 2013-05-03 12:08:01

+0

通過這個,會幫你寫一個線程安全的類http://stackoverflow.com/questions/6675905/which-features-make-a-class-to-be-thread-safe?rq=1 – 2013-05-03 12:10:22

相關問題