C# WCF服务方法可以像在StandardOleMarshalObject中一样在UI线程中执行?
我正在为一个商业应用程序开发一个插件,以公开关于在该应用程序中打开的文档的非常简单的信息,等等。应用程序本身不支持COM或NETAdvin,但只支持DLL中的C++ ADIN。 我想向COM客户端和运行在同一台机器上的网络客户端公开一些信息 对于我在C#中开发的COM客户机,这是一个COM接口的实现;然后在主机应用程序启动时创建一个对象,并在运行对象表中注册该对象。从C# WCF服务方法可以像在StandardOleMarshalObject中一样在UI线程中执行?,c#,multithreading,wcf,user-interface,ole,C#,Multithreading,Wcf,User Interface,Ole,我正在为一个商业应用程序开发一个插件,以公开关于在该应用程序中打开的文档的非常简单的信息,等等。应用程序本身不支持COM或NETAdvin,但只支持DLL中的C++ ADIN。 我想向COM客户端和运行在同一台机器上的网络客户端公开一些信息 对于我在C#中开发的COM客户机,这是一个COM接口的实现;然后在主机应用程序启动时创建一个对象,并在运行对象表中注册该对象。从standardolemarshallobject派生此实现似乎足以解决线程问题:显然,我的实现的方法仅在消息边界的主UI线程上调
standardolemarshallobject
派生此实现似乎足以解决线程问题:显然,我的实现的方法仅在消息边界的主UI线程上调用,这是一个要求
网络客户呢?我需要不同的信息,我不需要依赖特定的COM接口来公开这些信息。我曾试图开发和托管WCF服务,但我的服务方法在非UI therad和主机应用程序崩溃时被调用。如何在WCF上下文中复制StandardOleMarshalObject
行为?我需要实现一个IOperationInvoker
?有什么建议可以这样做吗
谢谢大家,请原谅我的英语不好。您应该使用
SynchronizationContext
将处理提前到UI线程。您可以在每个服务操作实现中显式调用SynchronizationContext.Send
,或者,如果有许多操作要实现,您可以在IOperationInvoker
中将发布到synch context作为方面来实现,谢谢@ilya.dorofev的建议。我需要使用已有的SynchronizationContex
实现,或者需要从SynchronizationContex
派生并实现新的SynchronizationContex
?显然,我不能使用现有的Windows窗体和WPFSynchronizationContex
,因为主机应用程序不是Windows窗体或WPF。当执行我的插件初始化代码时,宿主应用程序的主线程有一个null
SynchronizationContex
…你的宿主应用程序是什么?WinForms和WPF实现自己的同步上下文。要为您的环境实现SynchronizationContext,您应该了解如何将工作项分派到UI线程。第三方主机应用程序是本机C/C++Windows应用程序:因此没有WinForm,没有WPF…我不知道StandardOleMarshalObject如何将调用分派到UI线程,但显然它可以工作。是否可以为NET/WCF客户端复制此行为?如何实现?也许您应该将服务实现为实现StandardOleMarshalObject的对象上方的包装器?这个物体应该起到真正的作用。