c# - WCF:从服务内部访问 Windows 窗体

标签 c# asp.net wcf

我怎样才能实现这种情况?

我在 Windows 窗体中托管了一个 WCF 服务,每当该服务的客户端调用服务上的方法时,我希望该服务能够将消息写入 Windows 窗体上的文本框。

我在考虑让我的 WCF 服务成为单例,使用表单实现的接口(interface)将我的表单传递到服务中,然后存储该实例。然后当客户端调用该服务时,我可以简单地使用表单实例写入文本框。

我当然不能这样做,因为我不能将表单传递到 WCF 服务中。

有什么想法或代码示例吗?

最佳答案

服务实例和您的 Windows 窗体在两个单独的线程中运行,您不能只从服务实例更新主 UI 线程上的 UI 元素。

您需要使用同步上下文和委托(delegate),以便从服务线程正确安全地更新您的 UI。

参见 this CodeProject文章 - 大约在中间,作者谈到了“UI 线程问题”。这基本上就是您需要做的:

SendOrPostCallback callback = 
    delegate (object state)
    {   
        yourListBox.Add(state.ToString());
    };

_uiSyncContext.Post(callback, guestName);

有关该主题的全面介绍,请参阅 Juval Lowy 的 MSDN 文章“WCF Synchronization Contexts”。

在 Winforms 应用程序中托管 WCF 服务对我来说似乎是一个相当糟糕的主意 - 首先是因为所有这些线程问题,其次,它只有在 winforms 应用程序启动时才能工作。不能将 WCF 服务放入控制台应用程序或 Windows NT 服务,然后创建一个基于 Winforms 的监控应用程序,它可能会检查例如用于传入请求消息或其他内容的数据库表?

马克

关于c# - WCF:从服务内部访问 Windows 窗体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1372191/

相关文章:

C#比较2个字符串,排序,放入数组

asp.net - 如何使用 Angular 调用 Asp.Net Web API 2.0 http 批处理请求?

javascript - 添加作为链接添加到 BundleCollection 的 javascript 文件

.net - 如何从 PHP 使用 WCF Web 服务?

c# - WCF 启用 Ajax-如何增加一个 [OperationContract] 的数据长度大小

c# - 如何在vscode中调试cake项目?

c# - 从 Button 链接下载文件到 C 盘上的特定文件夹

c# - 为什么无法在 C# 中删除未使用的引用

c# - 如何创建由 5 个子图组成的图表

.net - 在WCF中获取服务器IP地址?