3

一連の静的メソッドを持つ C# (.NET 2.0) アプリを継承しました。これらのメソッドの 1 つを非同期イベント ベースのメソッドに変換する必要があります。メソッドが完了したら、イベント ハンドラーを起動したいと思います。私の質問は、静的メソッドからイベント ハンドラーを起動できますか? もしそうなら、どのように?

Google で検索すると、IAsyncResult の例しか見つかりません。ただし、次のようなことができるようにしたいです。

EventHandler myEvent_Completed;
public void DoStuffAsync()
{
  // Asynchrously do stuff that may take a while
  if (myEvent_Completed != null)
    myEvent_Completed(this, EventArgs.Empty);
} 

ありがとうございました!

4

3 に答える 3

5

プロセスはまったく同じです。唯一の違いは、実際にはthis参照がないことです。

static EventHandler myEvent_Completed;

public void DoStuffAsync()
{
    FireEvent();
} 

private static void FireEvent()
{
    EventHandler handler = myEvent_Completed;

    if (handler != null)
        handler(null, EventArgs.Empty);
}
于 2013-02-04T18:48:43.097 に答える
3

静的DoStuffAsyncである場合 (コードにはありません)、イベントmyEvent_Completedも静的にする必要があります。

static EventHandler myEvent_Completed; // Event handler for all instances

public static void DoStuffAsync()
{
  // Asynchrously do stuff that may take a while
  if (myEvent_Completed != null)
    myEvent_Completed(null, EventArgs.Empty);
} 

それ以外の場合DoStuffAsyncは、クラスのインスタンスを取得してイベントを発生させる必要があります。

EventHandler myEvent_Completed; // Note: Can still be private

public static void DoStuffAsync(YourClass instance)
{
   // Asynchrously do stuff that may take a while
   if(instance.myEvent_Completed != null)
      instance.myEvent_Completed(instance, EventArgs.Empty);
}

このイベントに対して異なるイベント ハンドラーを持つクラスの異なるインスタンスが必要な場合は、後者のルートを使用してインスタンスを渡します。

それ以外は、静的メソッドからイベントを発生させることにまったく問題はありません。

于 2013-02-04T18:50:29.710 に答える
0

操作している型で が宣言されている場合eventは、インスタンスを渡して (またはシングルトンの場合は回復して)、eventそこからオブジェクトにアクセスできます。たとえば、次のようになります。

EventHandler myEvent_Completed;
public void DoStuffAsync(MyClass o)
{
    // Asynchrously do stuff that may take a while
    if (o.myEvent_Completed != null)
        o.myEvent_Completed(this, EventArgs.Empty);
} 

それがシングルトンの場合、次のようなことができます:

EventHandler myEvent_Completed;
public void DoStuffAsync(MyClass o)
{
    // Asynchrously do stuff that may take a while
    if (Instance.myEvent_Completed != null)
        Instance.myEvent_Completed(this, EventArgs.Empty);
} 

InstanceSingleton アクセサーはどこにありますか。

于 2013-02-04T18:49:38.603 に答える