2009-08-28 82 views
0

現在與所有的WaitOne和ManualResetEvent的東西的工作(謝謝!)我有最後一個問題,那就是從一個線程運行在A類的函數這是B類的一部分 - 再次允許我說明...調用從一個線程B類A類的函數[C#]

看看函數「DoIt(obejct param)」在類A中,這需要由類A調用(如圖所示)以及通過B類中的線程(如圖所示)...如何實現這一點?某種形式的代表會提供幫助嗎?

class A 
{ 
private ManualResetEvent manualResetEvent; 
int counter = 0; 

public A() 
    { 
    manualResetEvent = new ManualResetEvent(false); 
    B child = new B(manualResetEvent); 

    if (manualResetEvent.WaitOne(1000, false)) 
     { 
     ... do the work I was waiting on ... 
     } 

    ... do more work ... 
    // Call the function DoIt from within A // 
    DoIt(param) 

    } 

    // This is the function that needs to be called from A and thread in B 
    void DoIt(object param) 
    { 
    counter++; 
    ... do something with param with is local to A ... 
    } 

}; 


Class B 
{ 
private ManualResetEvent manualResetEvent; 

public B(ManualResetEvent mre) 
    { 
    manualResetEvent = mre; 
    Thread childThread = new Thread(new ThreadStart(Manage)); 
    childThread.IsBackground = true; 
    childThread.Name = "NamedPipe Manager"; 
    childThread.Start(); 

    private void Manage() 
     { 
     ... do some work ... 
     ... call some functions ... 

     // Calling the function from Class A, obviouslly doesn't work as-is 
     DoIt(param); 

     manualResetEvent.Set(); 

     ... do more work ... 
     ... call more functions ... 
     } 
    } 
}; 

任何人都有關於如何以線程安全的方式完成此任務的任何建議嗎? 任何幫助將不勝感激。 謝謝,

回答

1

鑑於當前的設計最簡單的事情將是一個要傳遞給你的對象B,就像ManualResetEvent的你做的:

B child = new B(this, manualResetEvent); 
... etc... 

Class B 
{ 
private A parent; 
private ManualResetEvent manualResetEvent; 

public B(A p, ManualResetEvent mre) 
{ 
    parent = p; 
    manualResetEvent = mre; 
    ... etc ... 


private void Manage() 
{ 
    ... do some work ... 
    ... call some functions ... 

    parent.DoIt(param); 

    ... etc... 

當然,你需要標記A.DoIt公衆。

+0

只是通過「this」並使用parent.manualResetEvent代替它會更好嗎? – Shaitan00 2009-08-28 19:36:27

+0

也許吧。但是如果你關心的是好的設計,那麼你應該重新評估整個事情,而不僅僅是一件小事。 – DSO 2009-08-28 23:23:23

0

與你以前的問題,你必須通過的情況下,你要調用的方法上到B的構造。

+0

我總是儘管傳遞這是可怕的編碼...希望這是由ref和notval完成的,因爲我可以有5-10個線程(類B的實例)去... 並且這被認爲是線程安全的?如果2個孩子(B班)同時打電話給A.DoIt(...),怎麼辦? – Shaitan00 2009-08-28 19:37:27

+0

使用一個只能一次調用的鎖定代碼。不知道你在做什麼工作,很難知道你的代碼爲什麼不是線程安全的。 – 2009-08-28 19:44:26

+0

我可以鎖定功能嗎?或者當你使用DoIt時,你的意思是鎖定(父母)本身? – Shaitan00 2009-08-28 19:45:33

0

我假設必須有一些高年級操縱兩個類A和B?如一個GUI窗體或主線程?

你可以爲觸發時的工作應該做的B類中定義的事件。讓你的形式監聽事件,當它涉及呼叫的功能在A類

聽起來好像你的兩個類是高度依賴於彼此。如果B中的工作取決於A中的結果,反之亦然,則可能需要重新考慮類的實際模塊化程度。

+0

這是一個服務,有一個更高的等級(服務接口),但沒有GUI(無控制)。 – Shaitan00 2009-08-28 19:35:22

相關問題