.NET WinForm桌面程序设计

先上效果图:数据是写死模拟的。

背景:公司项目需求,需要每天或每小时20分定时推送消息给用户。

技术:基于微软强大的.net平台,引用第三方[Quartz 2.5.0.0]任务调度器(后面会专门写一个Quartz的安装使用教程),使用C#高级语法委托的方式实现消息的收集和发布。下面介绍开发步骤。

1.引入Quartz 2.5.0.0插件。 如图

2.创建窗体程序。

 

 3.编码,包含写入注册表,开机自启,初始化调度器配合作业和时间触发器加入调度器。

using Microsoft.Win32;
using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static Quartz.PushAlarmService;

namespace Quartz2
{
    public partial class Form1 : Form
    {
        IScheduler scheduler = null;
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                //this.DealMessage(string.Format("【消息提醒】{0}启动调度器", DateTime.Now.ToString()));//会报错
                //绑定消息方法
                MessageServcie.Instance.OnShowMessageDlg = new ShowMessageDlg(ShowMessageBox);

                //SetAutoRun("Quartz.exe", Application.StartupPath + @"\Quartz.exe", true);//开机重启

                scheduler = StdSchedulerFactory.GetDefaultScheduler();//从工厂中获取一个调度器实例化
                scheduler.Start();//启动调动器

                //==========例子2 (执行时 作业数据传递,时间表达式使用)===========
                IJobDetail job2 = JobBuilder.Create<DumbJob>()
                                        .WithIdentity("myJob", "group1")
                                        .UsingJobData("jobSays", "Hello World!")
                                        .Build();

                ITrigger trigger2 = TriggerBuilder.Create()
                                            .WithIdentity("mytrigger", "group1")
                                            .StartNow()
                                            .WithCronSchedule("/1 * * ? * *")     //时间表达式,5秒一次     
                                            .Build();

                scheduler.ScheduleJob(job2, trigger2); //把作业,触发器加入调度器。
                scheduler.Shutdown();         //关闭调度器。


            }
            catch (Exception ex)
            {
                this.DealMessage(string.Format("【消息提醒】{0}调度器报错,错误信息:{1}", DateTime.Now.ToString(), ex.Message));
                //throw ex;
            }
        }


        //消息处理
        private void DealMessage(string msg) {
            MessageServcie.Instance.OnShowMessageDlg.Invoke(msg);
        }

        public void ShowMessageBox(string msg) {
            if (this.InvokeRequired)
            {
                this.Invoke(new ShowMessageDlg(ShowMessageBox), msg);
            }
            else {
                AddMessage(msg);
            }
        }

        private void AddMessage(string msg) {
            if (this.dgvMessage.Rows.Count>10) {
                dgvMessage.Rows.RemoveAt(10);
            }

            dgvMessage.Rows.Insert(0, msg);
            dgvMessage.Rows[0].DefaultCellStyle.ForeColor = Color.ForestGreen;
        }


        /// <summary>
        /// 设置开机自启动
        /// </summary>
        /// <param name="keyName">目标名</param>
        /// <param name="filePath">exe路径</param>
        /// <param name="AddOrCancel">启动或取消</param>
        /// <returns></returns>
        private bool SetAutoRun(string keyName, string filePath, bool AddOrCancel)
        {
            try
            {
                RegistryKey Local = Registry.LocalMachine;
                RegistryKey runKey = Local.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\");
                if (AddOrCancel)
                {
                    runKey.SetValue(keyName, filePath);
                    Local.Close();
                }
                else
                {
                    if (runKey != null)
                    {
                        runKey.DeleteValue(keyName, false);
                        Local.Close();
                    }
                }
            }
            catch (Exception ex)
            {

                return false;
            }
            return true;
        }


    }
}

作业类的实现,下面的代码主要是业务逻辑代码,这里模拟的静态数据作为测试,每隔1秒不断随机产生张三xxx,并加入消息提醒推送,真实环境是通过调用微信开发平台API接口推送给用户。

using Quartz2;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Quartz
{
    public class PushAlarmService
    {
        /// <summary>
        /// 作业
        /// </summary>
        public class DumbJob : IJob
        {
            /// <summary>
            ///  context 可以获取当前Job的各种状态。
            /// </summary>
            /// <param name="context"></param>
            public void Execute(IJobExecutionContext context)
            {
                try
                {
                    List<string> list = new List<string>();
                    Random ran = new Random();
                    int RandKey = ran.Next(1, 999);
                    list.Add("张三"+ RandKey);
                   
                    MessageServcie.Instance.OnShowMessageDlg.Invoke(string.Format("定时添加用户成功!分别是{0},时间:{1}", list[0],DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));

                }
                catch (Exception ex)
                {

                    //throw ex;
                }
            }
        }
    }
}

  定义一个委托类(ShowMessageDlg),来实现消息推送的收集和发布。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Quartz2
{
    public delegate void ShowMessageDlg(string msg);//消息委托

    public class MessageServcie
    {
        
        private static MessageServcie _instance = null;
        
        public static MessageServcie Instance {
            get {
                if (_instance==null) {
                    _instance = new MessageServcie();
                }
                return _instance;
            }
        }

        public ShowMessageDlg OnShowMessageDlg = null;//消息代理

    }
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: .NET WinForm UI库是基于.NET框架下的一种用户界面开发工具集,可以帮助用户快速构建图形界面的应用程序。相比于传统的MFC UI开发,在开发过程中能够更快速、便捷地进行设计和开发WinForm UI库具有UI控件完善、易于使用、跨平台性强、可扩展性高等诸多优秀特性。 .NET WinForm UI库内置控件众多,例如按钮、文本框、标签、下拉列表框等,既可以满足基础功能需求,又可以自定义扩展。此外,WinForm UI库还包含了Windows Forms设计器,可快速布置并调整控件,并提供了丰富的图形样式和主题,使得应用程序看起来更加美观实用。 开发人员使用.NET WinForm UI库进行开发可以大量节省时间和精力,因为开发人员只需要按照控件的使用方法进行调用并不需要关注控件的底层实现,再加上库中提供的设计器,更加省时省力。而且.NET WinForm UI库兼容性良好,能很好地在不同操作系统平台上运行,大大提高了开发人员的开发体验。 总的来说,.NET WinForm UI库是一款十分强大而易于使用的UI开发工具,减少了开发人员自行开发UI的重复劳动,提升了开发效率。不仅如此,.NET WinForm UI库还可以使应用程序更加美观、实用,易于用户使用。 ### 回答2: .NET WinForms UI库是一个针对Windows桌面应用程序设计的用户界面(UI)库。它是微软.NET框架下的一部分,提供了一组预定义的UI控件,以帮助开发者更快、更容易地创建富有交互性和美观的用户界面。 WinForms UI库具有简单易用的特点,使得甚至没有UI编程经验的开发者也可以轻松地创建各种元素,例如窗口、按钮、标签、文本框、下拉列表框等等。这些UI控件的外观和行为可以通过属性编辑器进行设置,以满足各种不同UI设计需求。 同时,WinForms UI库也非常灵活,允许开发者自定义UI控件及其行为,以满足自己的特定需求。除此之外,WinForms UI库还具有相对稳定的性能和可靠性,适用于任何规模的桌面应用程序设计。 因此,WinForms UI库是.NET桌面应用程序开发的重要组成部分,已被广泛应用于多个行业领域中的各种应用场景,例如金融、医疗、工业控制等等。 ### 回答3: .NET WinForms UI库(User Interface Library)是一种用于创建桌面应用程序的开发框架。它提供了一组预定义的控件和组件,可以轻松实现用户界面的设计和开发WinForms可以非常简单地创建按钮,文本框,标签等控件,并可以与其他.NET语言(如C#或VB.NET)配合使用。 .NET WinForms UI库的一个关键优势是其易用性和灵活性。这个库重点处理了用户界面的开发,因此可以快速创建现代且用户友好的界面,而不必具备过多的UI设计经验。此外,这个库还提供了许多便捷的功能和方法,如自定义各类控件的样式、事件处理、拖放等能力,因此对于有经验的开发人员来说,能够充分展现自己的技术实力和创造力。 除了上述特点外,.NET WinForms UI库还具有良好的兼容性和高性能。因为它是一个.NET框架的一部分,因此可以轻松地与其他.NET程序集集成。同时,它也拥有优秀的性能和稳定性,因此能够满足大多数项目的要求。 总之,.NET WinForms UI库是一个强大的开发框架,可用于创建桌面应用程序。与其他用户界面设计工具相比,它的设计简单易懂,可扩展性好,因此正逐渐成为越来越多开发人员的首选。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值