Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF服务方法可以像在StandardOleMarshalObject中一样在UI线程中执行?_C#_Multithreading_Wcf_User Interface_Ole - Fatal编程技术网

C# WCF服务方法可以像在StandardOleMarshalObject中一样在UI线程中执行?

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线程上调

我正在为一个商业应用程序开发一个插件,以公开关于在该应用程序中打开的文档的非常简单的信息,等等。应用程序本身不支持COM或NETAdvin,但只支持DLL中的C++ ADIN。 我想向COM客户端和运行在同一台机器上的网络客户端公开一些信息

对于我在C#中开发的COM客户机,这是一个COM接口的实现;然后在主机应用程序启动时创建一个对象,并在运行对象表中注册该对象。从
standardolemarshallobject
派生此实现似乎足以解决线程问题:显然,我的实现的方法仅在消息边界的主UI线程上调用,这是一个要求

网络客户呢?我需要不同的信息,我不需要依赖特定的COM接口来公开这些信息。我曾试图开发和托管WCF服务,但我的服务方法在非UI therad和主机应用程序崩溃时被调用。如何在WCF上下文中复制
StandardOleMarshalObject
行为?我需要实现一个
IOperationInvoker
?有什么建议可以这样做吗


谢谢大家,请原谅我的英语不好。

您应该使用
SynchronizationContext
将处理提前到UI线程。您可以在每个服务操作实现中显式调用
SynchronizationContext.Send
,或者,如果有许多操作要实现,您可以在
IOperationInvoker
中将发布到synch context作为方面来实现,谢谢@ilya.dorofev的建议。我需要使用已有的
SynchronizationContex
实现,或者需要从
SynchronizationContex
派生并实现新的
SynchronizationContex
?显然,我不能使用现有的Windows窗体和WPF
SynchronizationContex
,因为主机应用程序不是Windows窗体或WPF。当执行我的插件初始化代码时,宿主应用程序的主线程有一个
null
SynchronizationContex
…你的宿主应用程序是什么?WinForms和WPF实现自己的同步上下文。要为您的环境实现SynchronizationContext,您应该了解如何将工作项分派到UI线程。第三方主机应用程序是本机C/C++Windows应用程序:因此没有WinForm,没有WPF…我不知道StandardOleMarshalObject如何将调用分派到UI线程,但显然它可以工作。是否可以为NET/WCF客户端复制此行为?如何实现?也许您应该将服务实现为实现StandardOleMarshalObject的对象上方的包装器?这个物体应该起到真正的作用。