首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF使ServiceController[]可见

WPF使ServiceController[]可见
EN

Stack Overflow用户
提问于 2011-10-14 06:17:20
回答 3查看 1.4K关注 0票数 1

因此,我正在尝试创建一个数据网格,它显示有关本地窗口服务的一些信息,特别是我的,我想要显示服务的显示名称和状态,然后有一个按钮来单击以启动或停止。我可以很好地链接按钮方法,但服务状态不会改变,任何建议以及如何使此属性对数据网格可见,也可以根据状态将按钮从启动更改为停止。其次,如果可能,我希望将停止命令设置为按钮命令。

有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-27 04:49:58

这就是我最终恳求的。它在很大程度上工作得很好,但我愿意接受任何人可能提出的任何代码建议。

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.ServiceProcess;

namespace v7quickbar
{
    class NotifiableServiceController : INotifyPropertyChanged
    {

        private ServiceController m_oServiceController = null;
        private System.Timers.Timer m_oServiceCheckTimer = new System.Timers.Timer();

        public ServiceControllerStatus Status { get { return this.m_oServiceController.Status; } }

        public string DisplayName { get { return this.m_oServiceController.DisplayName; } }

        public string ServiceName { get { return this.m_oServiceController.ServiceName; } }

        public bool CanStop { get { return this.m_oServiceController.CanStop; } }

        public NotifiableServiceController(ServiceController oService)
        {
            CreateObject(oService, TimeSpan.FromSeconds(.5));
        }

        public NotifiableServiceController(ServiceController oService, TimeSpan oInterval)
        {
            CreateObject(oService, oInterval);
        }

        private void CreateObject(ServiceController oService, TimeSpan oInterval)
        {
            m_oServiceController = oService;
            m_oServiceCheckTimer.Interval = oInterval.TotalMilliseconds;

            m_oServiceCheckTimer.Elapsed += new System.Timers.ElapsedEventHandler(m_oServiceCheckTimer_Elapsed);
            m_oServiceCheckTimer.Start();
        }

        public void Start()
        {
            try
            {
                this.m_oServiceController.Start();
                this.m_oServiceController.WaitForStatus(ServiceControllerStatus.Running);
            }
            catch (Exception)
            {
            }
        }

        public void Stop()
        {
            try
            {
                this.m_oServiceController.Stop();
                this.m_oServiceController.WaitForStatus(ServiceControllerStatus.Stopped);
            }
            catch (Exception)
            {
            }
        }

        public void Restart()
        {
            try
            {
                if (m_oServiceController.CanStop && (m_oServiceController.Status == ServiceControllerStatus.Running || m_oServiceController.Status == ServiceControllerStatus.Paused))
                {
                    this.Stop();
                    this.m_oServiceController.WaitForStatus(ServiceControllerStatus.Stopped);
                }

                if (m_oServiceController.Status == ServiceControllerStatus.Stopped)
                {
                    this.Start();
                    this.m_oServiceController.WaitForStatus(ServiceControllerStatus.Running);
                }
            }
            catch (Exception)
            {
            }
        }

        void m_oServiceCheckTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            ServiceControllerStatus oCurrentStatus = m_oServiceController.Status;
            m_oServiceController.Refresh();

            if (oCurrentStatus != m_oServiceController.Status)
            {
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Status"));
            }

        }

        public static IEnumerable<NotifiableServiceController> GetServices()
        {
            List<NotifiableServiceController> oaServices = new List<NotifiableServiceController>();
            foreach (ServiceController sc in ServiceController.GetServices())
            {
                oaServices.Add(new NotifiableServiceController(sc));
            }

            return oaServices;
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}
票数 3
EN

Stack Overflow用户

发布于 2011-10-14 13:12:30

您需要将服务封装到实现INotifyPropertyChanged的类中。在启动/停止服务时,在该实例上引发属性更改事件。

票数 3
EN

Stack Overflow用户

发布于 2011-10-14 15:15:35

可悲的是,因为ServiceController.GetServices()调用总是返回一个数组,所以我们必须使用DispatcherTimer,然后调用ServiceController.GetServices()并引发notify属性,该属性为保存服务数组的属性进行了更改。

为了可观察性而使其可观察性是不实际的,对吧?无论如何,我们不会从中获得任何好处。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7761094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档