【问题标题】:How to call a Windows service async from WPF & C#如何从 WPF 和 C# 异步调用 Windows 服务
【发布时间】:2015-10-12 14:49:29
【问题描述】:

我用 C# 编写了一个 Windows 服务。仅出于测试目的,我需要在服务上放置一个临时 WPF 前端。我正在使用 WPF 服务中的ServiceController 类来允许启动和停止服务,但我需要在测试期间将数据发送回 UI,以便测试人员知道何时有足够的数据通过服务停止它。

【问题讨论】:

    标签: c# wpf windows-services


    【解决方案1】:

    可以使用属性:

    [OperationContract (IsOneWay = true)]
    

    或异步

    【讨论】:

    • 这是 Windows 服务而不是 WCF 服务
    • 对不起,我以为这是 Wcf。
    【解决方案2】:

    在您的服务中添加一个提供您需要的信息的方法,然后您可以在您的 UI 中选择一个事件来调用该方法。

    假设每次在你的 UI 中点击一个按钮,你都会调用你的服务方法>

    private void Button_Click(object sender, EventArgs e)
    {
        yourservice.GetInfo();
    }
    

    我的建议是您选择最适合您需求的事件,您甚至可以在 UI 内发生的每个事件中调用它。

    您可以创建一个带有 while 循环的异步方法,该方法会在某个给定时间不断检查您的服务。

    public async Task<int> CheckServiceAsync()
    {
       while(condition)
       {
          Thread.Sleep(1000);
          return service.GetInfo();
       }
    }
    

    然后在您的用户界面中:

    TextBox.Text = await CheckServiceAsync();
    

    我认为异步方式是最好的,因为您的 UI 在等待您的服务响应时不会被锁定。

    编辑:

    您需要一种在这 2 个应用程序之间进行通信的方法。我以为你已经设置好了。您将需要一个 WCF(您可以使用命名管道)应用程序在它们之间进行通信。您的服务和您的 WPF 应用程序在不同的进程中运行。检查this。 NetNamedPipeBinding 对于同一台机器上的进程来说是最快的。

    命名管道(不使用 WCF)有点低级别,可能会变得很难。 WCF 更容易,并且您可以非常快速地进行设置(一旦您知道自己在做什么)。设置你的 WCF,使用我在这个答案中给你的逻辑,你会很好。

    检查this WCF tutorial。它具有配置所需的基础知识,但请确保使用 NetNamedPipeBinding 作为绑定。

    【讨论】:

    • 因为我使用的是 Windows 服务,所以在服务本身中,我在“程序”类中创建了一个公共静态布尔标志。服务设置。我无法将标志暴露给 wpf 应用程序
    • 我用我所说的更新了我的答案并删除了 cmets。请检查一下。快乐编码。 ;)
    • 是的,我很难让引用与异步一起工作......然后我记得我们的目标框架是 4.0 而不是 4.5。所以我不得不使用'旧'的方式来实现。 (与其他项目集成的遗留原因)。
    • 很高兴听到。希望我的回答对你有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    相关资源
    最近更新 更多