C# 如何使用WCF在windows服务和windows窗体之间进行通信?

C# 如何使用WCF在windows服务和windows窗体之间进行通信?,c#,winforms,wcf,windows-services,C#,Winforms,Wcf,Windows Services,我有一个超时在此超时之后,我有一个在windows服务和windows窗体之间使用WCF发送消息的窗口 我已经可以从windows窗体向windows服务发送消息: WCF public class Interact : IInteract { private Func<string, int> callback; public Interact(Func<string, int> callback) {

我有一个超时在此超时之后,我有一个在windows服务和windows窗体之间使用WCF发送消息的窗口

我已经可以从windows窗体向windows服务发送消息:

WCF

public class Interact : IInteract
    {
        private Func<string, int> callback;

        public Interact(Func<string, int> callback)
        {
            this.callback = callback;
        }

        public void SendRequest(string name)
        {
            var output = this.callback(name + " callback");
        }

        public string AskIfAlive()
        {
            return "ask";
        }

    }
计时器

public static class Class1
{
    static int Timeout = 0;
    static Timer tm = new Timer();

    public static void Init()
    {
        tm.Interval = 1000;
        tm.Elapsed += Tm_Elapsed;
        tm.Start();
    }

    private static void Tm_Elapsed(object sender, ElapsedEventArgs e)
    {
        Timeout++;
        if(Timeout >= 10)
        {
            // SEND MESSAGE TO WINDOWS FORM
            tm.Stop();
        }
    }

}

我想在windows服务超时后向windows窗体发送一些内容,但我不知道如何发送。有人可以帮助我吗?

您可以使用双工服务允许该服务也向windows窗体应用发送消息。 有关详细信息和示例,请参见此

双工服务是一种WCF服务,它接收一个回调,可用于向客户端发送消息。除了服务契约之外,您还需要创建服务使用的回调契约


请注意,回调绑定到WCF操作上下文。您可能需要将示例的静态
Init
方法更改为实例方法,并为每个调用/客户端创建
Class1
的新实例

我们设计的服务是双工模式还是请求/响应模式。服务的发起方是客户端,因此我们应该在Windows窗体应用程序中托管服务,而不是Windows NT服务。
此外,您的Windows NT服务似乎只向Windows窗体应用程序发送一次消息。因此,我认为没有必要使用双工服务。
关于双工服务,我曾经举过一个例子。希望它对你有用。


如果有什么我可以帮忙的,请随时告诉我。

我不确定是否理解,但我会试试你的样品,谢谢你的帮助。我试过了,但无法开始我的服务。我的服务总是停止,我无法测试它。@user10863293您需要调试服务启动。查看此链接了解详细信息:希望这有帮助。感谢您的帮助,我将看到您的示例。我会向你解释我的交换,因此,客户端将要求windows服务运行某些内容,以便该服务在运行时发送某些内容,并且每隔10分钟,服务器将询问客户端是否运行,客户端将回答某些内容。我创建了一个新项目,我只是复制并粘贴了您的示例,但我有一个错误:System.ServiceModel.AddressAccessDeniedException:“HTTP无法注册URL HTTP://+:3333/。您的进程没有对此命名空间的访问权限(有关详细信息,请参阅)。'因为机器端口占用由操作系统驱动程序Http.SYS组件管理。它需要操作系统将端口权限分配给该用户。我们只需使用管理员帐户运行console应用程序即可解决此问题。此外,如果服务器端和客户端不是同一台计算机,我们应该在客户端提供身份验证凭据。factory.credentials.Windows.ClientCredential.UserName=“Serverwindowsuser”;factory.Credentials.Windows.ClientCredential.Password=“123456”:如果有什么我可以帮助的,请随时告诉我。此外,我不知道如何使用来自Windows服务的双工来请求客户端执行操作
public static class Class1
{
    static int Timeout = 0;
    static Timer tm = new Timer();

    public static void Init()
    {
        tm.Interval = 1000;
        tm.Elapsed += Tm_Elapsed;
        tm.Start();
    }

    private static void Tm_Elapsed(object sender, ElapsedEventArgs e)
    {
        Timeout++;
        if(Timeout >= 10)
        {
            // SEND MESSAGE TO WINDOWS FORM
            tm.Stop();
        }
    }

}