2011-10-21 112 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); 

我也注意到,我实际上不必管理我的班级中的委托列表。一个事件对我来说确实如此。