我有一个名为Service的静态类,它启动一个新线程来保持来自其他进程的侦听消息。在这个类中,我管理一个需要在收到消息时调用的委托列表。这些委托的一些方法需要在主线程中运行。
如果我以某种形式创建威胁,例如,我可以做
this.Invoke(@delegate, new object[] { messageReceived });
但我不能那样做,因为我在静态课堂上。所以我尝试这样做:
@delegate.Invoke(messageReceived);
但是它不起作用,因为它不会改变执行方法的子进程(它是从我创建的威胁执行的,而不是从主威胁执行的。)
我该怎么办?
谢谢!
答案 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);
我也注意到我实际上没有必要在班上管理委托列表。一个事件对我来说就是这样。