C#从静态类调用委托

时间:2011-10-21 20:33:34

标签: c# multithreading static delegates

我有一个名为Service的静态类,它启动一个新线程来保持来自其他进程的侦听消息。在这个类中,我管理一个需要在收到消息时调用的委托列表。这些委托的一些方法需要在主线程中运行。

如果我以某种形式创建威胁,例如,我可以做

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

但我不能那样做,因为我在静态课堂上。所以我尝试这样做:

@delegate.Invoke(messageReceived);

但是它不起作用,因为它不会改变执行方法的子进程(它是从我创建的威胁执行的,而不是从主威胁执行的。)

我该怎么办?

谢谢!

4 个答案:

答案 0 :(得分:2)

修改您的static课程以接受参数。

this变量作为参数传递给static班级。

答案 1 :(得分: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;
    }
}

答案 2 :(得分:0)

您的问题可以通过SynchronizationContext解决。简而言之,捕获UI线程的SynchronizationContext并使用Post方法在GUI消息循环上发布项目。不用多写,因为你可以找到一篇优秀的文章Here

答案 3 :(得分:-1)

对不起,我的问题忘了。我还想避免在我的静态类中使用System.Windows.Forms类。

我找到的最简单的方法是从委托对象调用Invoke方法(正如我之前尝试过的那样,它不起作用)。在委托的方法中这样做:

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

我也注意到我实际上没有必要在班上管理委托列表。一个事件对我来说就是这样。