2012-02-08 33 views
1

我知道這是非常基本的東西,但我正在努力圍繞它進行思考。我該如何定義一個事件,然後在事件發生時啓動一個代表

好了,所以我有我想要運行的方法:

public static void DelegateTest(string testStuff) 
{ 
    for (int i = 0; i < 4; i++) 
    { 
     Console.WriteLine(testStuff); 
    } 
} 

然後,這種方法的範圍之外(但我班的範圍內),我定義我的委託以相同的輸出類型和輸入參數爲我的方法:

public delegate void myDelegate(string test); 

我實例化我的委託,像這樣:

myDelegate md = new myDelegate(DelegateTest); 

然後,我可以通過BeginInvoking委託儘可能多地啓動我的方法,並且這些方法將在單獨的線程中並行運行。

md.BeginInvoke("Hello World", null, null); 
md.BeginInvoke("Hello World Again", null, null); 
md.BeginInvoke("Hello World A Third Time", null, null); 

我現在如何定義一個事件,並且只在事件發生時異步啓動我的方法?另外,什麼事件可以是什麼限制?我的電腦上發生的任何事情都可以定義爲事件還是隻有某些事情?

編輯:例如說,在完成上述操作後,我想要創建一個事件並將該事件定義爲'空格鍵已被按下'。每次按下空格鍵時,都會發生這種情況。當事件發生時,我想異步啓動我的方法,如果空格鍵未被按下,我不想異步啓動我的方法。

我該怎麼辦?

+0

你真的是指「異步」嗎?或者你的意思是「同步」?看起來他們已經是異步的了。 – yoozer8 2012-02-08 16:21:56

+0

我知道,問題是,一旦我創建了一個方法,然後一個委託並且我知道如何異步啓動該方法,那麼我該如何創建一個事件並將該事件與委託相關聯。我是否需要更新我的問題以清楚說明? – JMK 2012-02-08 16:23:31

+0

@JMK你可以通過調用它來創建事件,因爲你已經知道了。如何和何時完成取決於你。聽起來就像你試圖抓住你的程序之外的事件?你想捕捉什麼事件? – Simon 2012-02-08 16:26:35

回答

3

只需使用Invoke而不是BeginInvoke進行同步調用。

編輯:根據ThePower的答案,你不需要調用,你可以調用你的委託,就好像它是一個函數(因爲它!)。

EDIT2:你實際上正在嘗試註冊一個事件處理程序。爲此,您不需要創建自己的代理。用於處理的WinForms的按鍵事件的例子:

public class MyForm : Form 
{ 
    public MyForm() 
    { 
     KeyPress += OnKeyPressHandler; 
    } 


    private void OnKeyPressHandler(object sender, KeyPressEventArgs keyPressEventArgs) 
    { 
    //TODO: whatever you need to do... 
    } 
} 
+0

謝謝,但問題更多的是關於事件。我創建了一個方法,然後是一個委託來匹配方法,然後我開始異步(我想)。現在我已經掌握了這麼多,然後如何創建一個事件並將其鏈接到我的代理? – JMK 2012-02-08 16:28:17

+0

@JMK我想你可能會誤解什麼是事件?你能指定你想要做什麼嗎? – Simon 2012-02-08 16:31:31

+0

@JMK你會想看看事件,然後,而不是委託。 – ThePower 2012-02-08 16:31:39

1

如果你想使用它作爲一個event,檢查出的事件類型。有一個很好的例子here

儘管如此,如果你想用你的委託......

您已經定義了異步的,所以對於同步使用:

md("Hello World", null, null); 
md("Hello World Again", null, null); 
md("Hello World A Third Time", null, null); 
0

我不知道我完全理解你的問題。在C#中,出於所有實際目的,事件是一個委託,意味着任何委託都可以用作事件。

使用你的例子:

public class MyClass 
{ 
    public event MyDelegate MyEvent; 
} 

您現在可以註冊事件處理與MyEvent,然後在事件處理程序,您可以:

public delegate void MyDelegate(string test); 

你現在可以在一個類中使用MyDelegate作爲事件執行你想要的任何代碼。從傳統意義上講,這是用C#定義事件的唯一方法。

另一個需要考慮的選擇是使用發佈/訂閱模式,如EventAggregator。此模式通常不依賴於委託,而是依賴於聚合器對象來通知所有訂閱者已發佈的事件。在這種情況下,事件實際上可以是任何包含訂戶所需信息的對象。

相關問題