C# 如何从WPF&C异步调用Windows服务

C# 如何从WPF&C异步调用Windows服务,c#,wpf,windows-services,C#,Wpf,Windows Services,我已经用C编写了一个Windows服务。仅出于测试目的,我需要在该服务上放置一个临时WPF前端。我正在使用WPF服务中的ServiceController类来允许启动和停止服务,但是我需要在测试期间将数据发送回UI,以便测试人员知道何时有足够的数据通过服务来停止它 可以使用属性: [OperationContract (IsOneWay = true)] 或者Async在服务中添加一个方法,该方法提供您需要的信息,然后您可以在UI中选择一个事件来调用该方法 假设每次在UI中单击按钮时,您都会调

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

可以使用属性:

[OperationContract (IsOneWay = true)]

或者Async

在服务中添加一个方法,该方法提供您需要的信息,然后您可以在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();
   }
}
我认为异步方式是最好的,因为您的UI在等待服务响应时不会被锁定

编辑:

您需要一种在这两个应用程序之间进行通信的方法。我以为你已经准备好了。您需要一个WCF,您可以使用命名管道应用程序在它们之间进行通信。您的服务和WPF应用程序正在不同的进程中运行。检查NetNamedPipeBinding是同一台计算机上进程速度最快的

不使用WCF的命名管道的级别有点低,可能会变得很难。WCF更简单,一旦你知道你在做什么,你就可以很快地完成设置。设置你的WCF,使用我在这个答案中给你的逻辑,你会很好


检查。它提供了配置所需的基础知识,但请确保使用NetNamedPipeBinding作为绑定

这是Windows服务不是WCF服务抱歉,我以为这是WCF。因为我使用的是Windows服务,所以在服务本身中,我在“Program”类中创建了一个公共静态布尔标志。服务设置。我在向wpf appI公开标志时遇到问题。我用我所说的全部更新了我的答案,并删除了评论。请检查一下。快乐编码;是的,我很难让引用与异步一起工作……然后我想起我们的目标框架是4.0而不是4.5。所以我不得不用“旧”的方式实现。与其他项目集成的遗留原因。很高兴听到。我希望我的回答对你有帮助。
TextBox.Text = await CheckServiceAsync();