【问题标题】:WCF: Accessing a windows form from inside a serviceWCF:从服务内部访问 Windows 窗体
【发布时间】:2009-09-03 08:44:46
【问题描述】:

我怎样才能实现这个场景?

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

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

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

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

【问题讨论】:

  • 所以你的服务只有在有人碰巧运行你的 WinForms 应用程序时才有效?

标签: c# asp.net wcf


【解决方案1】:

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

您需要使用同步上下文和委托,以便从服务线程正确安全地更新您的 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 的监视应用程序,这可能会检查例如用于传入请求消息或其他东西的数据库表?

马克

【讨论】:

  • 在富客户端中托管 WCF 服务是一种完全有效的方案。例如,您可以使用它来实现回调通道、设置对等网络等。WCF 不仅仅是一种基于服务器的技术。
【解决方案2】:

看看this SO answer——据我了解,基本上是同一个问题。

可以将依赖项注入 WCF 服务:您只需要实现一个自定义的 ServiceHostFactory 来为您连接一切。

【讨论】:

    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 2012-01-07
    • 2011-02-17
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    相关资源
    最近更新 更多