2013-02-04 80 views
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); 
} 

謝謝!

+0

「DoStuffAsync」是靜態的嗎?如果不是,你所指的靜態方法在哪裏? –

回答

4

過程是完全一樣的,唯一的區別是沒有真正的this參考。

static EventHandler myEvent_Completed; 

public void DoStuffAsync() 
{ 
    FireEvent(); 
} 

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

    if (handler != null) 
     handler(null, EventArgs.Empty); 
} 
+0

如果事件需要是基於實例的權利,這將不起作用? –

+0

@Michael問題是關於靜態事件。 – Lloyd

+0

@ david-yaw爲什麼編輯? – Lloyd

0

如果event在類型聲明你的工作,你可以在一個實例傳遞(或恢復它,如果它是一個Singleton),並從那裏訪問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是辛格爾頓訪問。

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

如果您需要您的類的不同實例有此事件不同的事件處理程序,你會想要去與後者的路線,並傳遞一個實例。

除此之外,從靜態方法觸發事件絕對沒有錯誤。

+0

你不能在靜態方法中使用它。 – Orch

+0

@Orch - 哎呀!接得好。 –

相關問題