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

时间:2009-09-03 08:44:47

标签: c# asp.net wcf

我如何实现这种情况?

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

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

我无法做到这一点,因为我无法将表单传递给WCF服务。

任何想法或代码示例?

2 个答案:

答案 0 :(得分:2)

服务实例和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的监控应用程序,可以检查例如传入请求消息的数据库表?

马克

答案 1 :(得分:1)

看看this SO answer - 据我所知,它基本上是同一个问题。

可以将依赖关系注入到WCF服务中:你只需要实现一个自定义ServiceHostFactory,为你解决所有问题。