9

次のように定義されているイベントデリゲートがあります。

public delegate void CallbackDelegate(Data data);
public event CallbackDelegate OnDataComplete;

イベントを非同期的に発生させます。

// Raise the OnDataComplete event
OnDataComplete.BeginInvoke(new Data(), null, null);

その後、の署名はBeginInvoke次のようになります。

IAsyncResult CallbackDelegate.BeginInvoke(Data data, AsyncCallback callback, object @object)

私が見たほとんどの例では、パラメータがBeginInvokeで呼び出されていますが、そのパラメータの目的を説明するドキュメントが見つかりません。@objectnull

では、そのパラメーターの目的は何ですか?何に使えますか?

4

3 に答える 3

10

そこで欲しいものは何でも提供できます。AsyncResult メソッドでは、IAsyncResult.AsyncState を使用してこの値を取得できます。それはあなたの使用のためにそこにあります。

于 2011-01-21T20:24:22.003 に答える
9

メソッドからコールバックに関連情報を渡すことができるようにするためです。C# にはラムダ式があり、デリゲートは状態を持つことができるため、これが役に立たない場合があり、null を渡すだけでかまいません。しかし、これは と少し似てControl.Tagおり、便利な情報をコールバックに与えることができます。


アップデート:

それが存在する理由の起源は、関数ポインターのみを持ち、クロージャーのない言語にまでさかのぼります。(「クロージャー」という言葉を調べてみたくなるかもしれません... 簡潔に説明することはできません。) C では、関数ポインターのみがあり、デリゲートはありません。したがって、関数ポインターは状態を保持できません。したがって、コールバックを提供するたびに、呼び出し先は追加のポインターを渡すことであなたを助け、必要なデータをコールバックに渡すことができました。.NET では、これらはあまり必要ではありません (デリゲートにはTargetオブジェクトがあり、状態を保持できるため)。

于 2011-01-21T20:18:44.967 に答える
5

これは、AsyncCallback コードで取得できるIAsyncResult.AsyncStateになる単なる状態オブジェクトです。ThreadPool.QueueWorkItem(WaitCallback, Object)のようなものです。

于 2011-01-21T20:18:40.460 に答える