2011-06-09 133 views
1

我只是想知道有關父母傳遞給孩子的問題,如果這樣做,等等,以便孩子可以從父母訪問功能,在這種情況下,它涉及到線程。我的情況如下:基於C#-Threads和父母傳遞給孩子

public class A 
{ 
    public A() 
    { 
     B b = new B(this); 
     Thread thread = new Thread(new ThreadStart(b.GO)); 
    } 
    public string DoSomething() { return "Something Done"; } 
} 

public class B 
{ 
    A _a; 
    public B(A a) 
    { 
     _a = a; 
    } 
    public void GO() { _a.DoSomething(); } 
} 

上面我想了解一下任何公約相沖突的是生效,當你做這樣的事情發生的,或者有問題,這樣做不好做到這一點?我知道那肯定會帶來一些線程安全問題。但我的整體問題可以做到這一點,是否會帶來一些其他問題?我將如何更新主線程中的值? 我希望它分開的原因是因爲B類中有一個定時器(不是在顯示的代碼中),當它用完時會告訴A類它已完成,重置定時器並返回到睡眠狀態直到定時器再次耗盡,否則我該怎麼做?

〜問候,

海因裏希

+0

如果B有一個計時器,爲什麼A需要一個線程? – Amy 2011-06-09 04:33:23

+0

因爲它們在做什麼時是分開的,所以A必須啓動B,然後返回並完成與B分離的一組不同的任務,如果想像這樣看待它,A有自己的計時器,它可以運行並且獨立於B,在B有效時,A必須可以自由地執行其他功能 – Heinrich 2011-06-09 04:41:13

回答

1

處理你正在做的事情的另一種方式是讓B提出一個事件並讓A處理事件。這樣你就不必將A傳遞給B.我不知道你的真實結構是什麼,但可以說B的線程函數做了更復雜的事情,A實現了IDisposable。如果A在B達到它正在調用A的方法之前處理了,那麼會發生什麼。對我來說,處理這種情況的更簡潔的方法是讓B爲它提出一個事件和一個A寄存器。

public class A 
{ 
    B _b; 

    public A() 
    { 
     _b = new B(); 
     _b.DidSomething += HandleDidSomething; 
    } 

    private void HandleDidSomething(object source, EventArgs e) 
    { 
     // Handle the B did something case 
    } 

    public void WaitForBToFinish() { _b.DoneDoingThings.WaitOne(); } 
} 

public class B 
{ 
    Event EventHandler DidSomething; 

    ManualResetEvent DoneDoingThings = new ManualResetEvent(false); 

    public B() {} 

    public void StartDoingThings() 
    { 
     new Thread(DoThings).Start(); 
    } 

    private void DoThings() 
    { 
     for (int i=0; i < 10; i++) 
     { 
      Thread.Sleep(1000); 
      OnDidSomething(new EventArgs()); 
     } 

     DoneDoingThings.Set(); 
    } 

    private void OnDidSomething(EventArgs e) 
    { 
     if (DidSomething != null) 
     { 
       DidSomething(e); 
     } 
    }  
} 

注 - 你應該在B類實現IDisposable和ManualResetEvent處置,我只是懶得做的一切,示例代碼,只是想給大家介紹使用事件信號的工作是一個想法完成。

3

看代碼,你似乎沒有任何線程的問題。如果您正在處理相同的變量,則可能會引入競爭條件,但這對於您提出的情況並不特別。

你會像對待任何其他多線程情況和鎖定可能被多個線程訪問的資源。

我建議以下的在線圖書:http://www.albahari.com/threading/

我不認爲你真的要他們儘可能緊你是連接,你正在嘗試做的是簡單地傳遞信息或線程之間的狀態。所以我建議不讓他們緊密連接的原因是爲了減少耦合。

我引用的網站包含許多不同的信令技術。選擇最簡單的您的需求。我需要更多關於您的具體要求的細節來爲您挑選一個。

+0

+1用於推薦albahari線程站點。這是例外! – pstrjds 2011-06-09 05:15:09