【发布时间】:2015-10-12 14:49:29
【问题描述】:
我用 C# 编写了一个 Windows 服务。仅出于测试目的,我需要在服务上放置一个临时 WPF 前端。我正在使用 WPF 服务中的ServiceController 类来允许启动和停止服务,但我需要在测试期间将数据发送回 UI,以便测试人员知道何时有足够的数据通过服务停止它。
【问题讨论】:
标签: c# wpf windows-services
我用 C# 编写了一个 Windows 服务。仅出于测试目的,我需要在服务上放置一个临时 WPF 前端。我正在使用 WPF 服务中的ServiceController 类来允许启动和停止服务,但我需要在测试期间将数据发送回 UI,以便测试人员知道何时有足够的数据通过服务停止它。
【问题讨论】:
标签: c# wpf windows-services
可以使用属性:
[OperationContract (IsOneWay = true)]
或异步
【讨论】:
在您的服务中添加一个提供您需要的信息的方法,然后您可以在您的 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 作为绑定。
【讨论】: