2011-08-05 52 views
-1

我有一個疑問..回調/委託?

我想創建一個函數,它看起來就像這樣......

public class A  //this is just a class file 
{ 
    function dowork() 
    { 
     //work 1 

     INPUT = here in this line it should call a delegate function or raise event etc... 

     //work 2 using INPUT 
    } 
} 

public class B 
{ 
    function myfn() 
    { 
     A objA = new A(); 
     objA.dowork(); 

    } 
} 

在「A級」我們將提高事件左右&它會顯示一個窗體給用戶,然後用戶會輸入一些值&我們需要將該值返回到A類 - > dowork方法....那麼只有我們應該繼續「工作2」

這也應該支持多線程...任何人都知道我們如何實現這一點?

謝謝:)

+1

當你說Windows窗體時你是什麼意思?你通過asp.net標記問題,所以我相信這是一個網頁,你想抓住一些用戶輸入? – sll

回答

0

您可以使用ManulResetEvent用於此目的:在運行輸入表單,當它做到這一點的形式設置的事件,所以你可以從A.dowork方法抓住它。而在行動投入運行無限循環,檢查事件狀態和流程應用程序事件,讓你在這個時候應用程序負責:

public class A  //this is just a class file 
{ 
    private ManualResetEvent _event; 

    public void dowork() 
    { 
    //work 1 

    _event = new ManualResetEvent(false); 
    //INPUT = here in this ... 
    Worker worker = new Worker(); 
    worker.DoInput(_event); 

    while(true) 
    { 
     if(_event.WaitOne()) 
     break; 
     Application.DoEvents(); 
    } 

    //work 2 using INPUT 
    } 
} 

class Worker 
{ 
    private ManualResetEvent _event; 

    public void DoInput(ManualResetEvent @event) 
    { 
    _event = @event; 

    // Show input form here. 
    // When it done, you call: _event.Set(); 
    } 
} 

另外,我建議你(如果你能)使用異步庫(它是可作爲獨立設置使用)。正如你看到你只是等待,而其他的代碼獲得沒有任何UI鎖定和事件執行

public class A  //this is just a class file 
{ 
    public async void dowork() 
    { 
    //work 1 

    //INPUT = here in this ... 
    Worker worker = new Worker(); 
    wait worker.DoInput(); 

    //work 2 using INPUT 
    } 
} 

class Worker 
{ 
    public async void DoInput() 
    { 
    InputForm form = new InputForm(); 
    wait form.ShowInput(); 
    } 
} 

public class B 
{ 
    async void myfn() 
    { 
    A objA = new A(); 
    wait objA.dowork(); 
    } 
} 

:在那裏,你可以更直接的方式實現它。 如果需要的話,我可以提供關於異步/等待如何工作的更深入的解釋。

+0

謝謝...將檢查並回復你:) – nsrajesh