3

我继承了一个具有一堆静态方法的 C# (.NET 2.0) 应用程序。我需要将其中一种方法转换为基于事件的异步方法。当方法完成后,我想触发一个事件处理程序。我的问题是,我可以从静态方法中触发事件处理程序吗?如果是这样,怎么做?

当我谷歌时,我只找到 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);
} 

单例访问器在哪里Instance

于 2013-02-04T18:49:38.603 回答