2012-02-08 6 views
1

これは本当に基本的なものだとわかっていますが、私はその周りに自分の心を包み込むのに苦労しています。イベントを定義してイベントが発生したときにデリゲートをキックオフする方法

[OK]をので、私は実行したい方法があります:私は同じ出力タイプで、私のデリゲートを定義し、この方法の適用範囲の外(ただし、私のクラスの範囲内で)、その後

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); 

BeginInvokeによってデリゲートを呼び出すことで、私が好きなだけ何度でも自分のメソッドを開始することができ、メソッドは別のスレッドで並べて実行されます。

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

イベントを定義して、イベントが発生したときにメソッドを非同期に開始する方法を教えてください。また、イベントの可能性に関する制限はありますか?私のコンピュータ上で起こることは、イベントとして、または特定のものだけを定義することができますか?

編集:上記を実行した後、たとえば、イベントを作成し、このイベントを「スペースバーが押された」と定義するとします。スペースバーが押されるたびに、これが起こっているイベントです。イベントが発生すると、メソッドを非同期で開始したいので、スペースバーが押されていない場合、メソッドを非同期に開始したくありません。

どうすればいいですか?

+0

「非同期的に」という意味ですか?それとも「同期的に」という意味ですか?彼らはすでに非同期であるようだ。 – yoozer8

+0

私が知っている質問は、メソッドを作成した後にデリゲートを作成し、非同期にメソッドを開始する方法を知っています。次に、イベントを作成し、そのイベントをデリゲートに関連付けます。これを明確にするために質問を更新する必要がありますか? – JMK

+0

@ JMKあなたがすでに考え出したように、イベントを呼び出すことによってイベントを作成します。どのようにしていつやるのがあなた次第です。あなたのプログラムの外でイベントをキャッチしようとしているように聞こえる?どのようなイベントをキャプチャしようとしていますか? – Simon

答えて

3

同期呼び出しにはBeginInvokeではなくInvokeを使用してください。

編集:ThePowerの答えによると、あなたはInvokeを必要としません、それは関数であるかのようにあなたのデリゲートを呼び出すことができます!

EDIT2:実際にはイベントハンドラを登録しようとしています。このために、独自のデリゲートを作成する必要はありません。リサイズでKeyPressイベントを処理するための例:

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


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

ありがとうございます。しかし、質問はイベントの詳細です。メソッドを作成した後、メソッドにマッチするデリゲートを作成してから、非同期に開始します(これは私が望むものです)。これまで私がこれまでに持っていたことは、どうやってイベントを作り、それを私の代理人にリンクさせるのですか? – JMK

+0

@JMKあなたはイベントが何かを誤解していると思いますか?あなたは何をしたいのかを正確に指定できますか? – Simon

+0

@JMKあなたは、委譲するのではなく、イベントを見たいでしょう。 – ThePower

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 delegate void MyDelegate(string test); 

をあなたは今、クラスのイベントとしてMyDelegateを使用することができます:

public class MyClass 
{ 
    public event MyDelegate MyEvent; 
} 

あなたは今MyEventでイベントハンドラを登録することができ、その後、イベントハンドラにすることができますあなたの例を使用して

必要なコードを実行します。伝統的な意味から、これはC#でイベントを定義する唯一の方法です。

もう1つの選択肢は、EventAggregatorなどのパブリッシュ/サブスクライブパターンを使用することです。通常、このパターンはデリゲートに依存せず、代わりにアグリゲータオブジェクトを使用して、パブリッシュされたイベントのすべてのサブスクライバに通知します。このシナリオでは、イベントは実際には、加入者が期待する情報を含むオブジェクトである可能性があります。

関連する問題