2011-10-21 52 views
2

我有一個名爲Service的靜態類,它啓動一個新的線程以不斷監聽來自其他進程的消息。在這個類中,我管理收到消息時需要調用的代理列表。這些委託的一些方法需要在主線程中運行。C#從靜態類中調用委託

如果我想創建某種形式的威脅,例如,我可能只是做

this.Invoke(@delegate, new object[] { messageReceived }); 

但我不能這樣做,因爲我在一個靜態類是。所以,我試圖做這樣的:

@delegate.Invoke(messageReceived); 

但它不工作,因爲它不會改變其中執行方法(它是從我創建的威脅執行,而不是從主之一)的子進程。

我該怎麼辦?

謝謝!

+0

BeginInvoke,不是Invoke。 –

回答

2

修改您的static類以接受參數。

將您的this變量作爲參數傳遞給您的static類。

0

爲什麼不使用System.Threading.SynchronizationContext類? 如果你打算在WPF中移動將很好學習這個。同步上下文是處理消息互聯的標準可移植方法。 每個系統都有一個版本來自System.Web,windows窗體,wpf以及自定義同步上下文。

public static class MyClass 
{ 
    public static void MyFunction(MyObject messageReceived) 
    { 
     // Call this stuff from non-gui thread. 

     SynchronizationContext syncContext = SynchronizationContext.Current; 
     syncContext.Send(MyMethod, param); 

     // You can also use SyncContext.Post if you don't need to wait for completion. 
     syncContext.Post(MyMethod, param); 
    } 

    private static void MyMethod(object state) 
    { 
     MyObject myObject = state as MyObject; 
     ... do my stuff into the gui thread. 
    } 

    // Using anonymous delegates you can also have a return value using Send. 
    public static int MyFunctionWithReturnValue(MyObject parameter) 
    { 
     int result = 0; 
     SynchronizationContext.Current.Post(delegate (object p) 
     { 
      result = parameter.DoSomething() 
     }, null); 

     return result; 
    } 
} 
0

您的問題可以通過SynchronizationContext解決。簡而言之,捕獲UI線程的SynchronizationContext,並使用Post方法在GUI消息循環中發佈項目。不用寫更多,因爲你可以找到一篇優秀的文章Here

-1

對不起,我忘記了我的問題。我也想避免在我的靜態類中使用System.Windows.Forms類。

我發現的最簡單的方法是從委託對象中調用Invoke方法(正如我之前所嘗試的,它不起作用)。並在代表的方法做到這一點:

if (this.InvokeRequired) 
    this.Invoke(MethodWhichDoesRealStuff, new object[] { message }); 
else 
    MethodWhichDoesRealStuff(message); 

我也注意到,我實際上不必管理我的班級中的委託列表。一個事件對我來說確實如此。