在项目架构时,首先我们会考虑采用WINUI层与Bussiness层分离的N层结构。那么在WinUI层与Bussiness层之间一些动态提示,可采用Event来实现。
比如,Bussiness层中要对n条数据进行foreach的逐条处理,需要在WinUI层的某Form中看到对应的状态提示,包括进度条progressBar,同时ListBox中也要有对每条记录的处理状态进行提示。
我不提倡将progressBar等对象传递到Bussiness层,这样耦合太强。
也不提倡在WinUI方用Timer等轮训去查Bussiness层中的执行状态,这样负载大,同时有漏掉某些状态提示。
采用事件触发方式,可以完美的解决这个问题。
下面是示例,图是我们需要的效果:


这个类是放在Bussiness层的数据处理类:
 1using System;
 2using System.Threading;
 3
 4namespace WinTest
 5{
 6    public delegate void ProgressEventHandler(int CurrNumber,string CurrText);
 7    /// <summary>
 8    /// EventLog 的摘要说明。
 9    /// </summary>

10    public class EventLog
11    {
12        public event ProgressEventHandler ProgressEvent;
13
14        public EventLog()
15        {
16            //
17            // TODO: 在此处添加构造函数逻辑
18            //
19        }

20
21        public void Run(int MaxCount)
22        {
23            for(int i=1;i<=MaxCount;i++)
24            {
25                Thread.Sleep(500);
26                ProgressEvent(i,"当前处理条目为:"+i.ToString());
27            }

28        }

29    }

30}

31

下面这段是在UI层的某Form的执行代码:
 1private EventLog log;
 2public Form1()
 3        {
 4            //
 5            // Windows 窗体设计器支持所必需的
 6            //
 7            InitializeComponent();
 8
 9            //
10            // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
11            //
12            log=new EventLog();
13            log.ProgressEvent +=new ProgressEventHandler(log_ProgressEvent);
14        }

15private void btnEventLog_Click(object sender, System.EventArgs e)
16        {
17
18            if(txtMaxCount.Text.Trim()!=String.Empty )
19            {
20                this.progressBar1.Minimum =1;
21                this.progressBar1.Maximum =int.Parse(txtMaxCount.Text.Trim());
22                ThreadStart workThreadStart = new ThreadStart(MethodRun);
23                Thread workThread = new Thread(workThreadStart);
24                workThread.IsBackground=true;
25                workThread.Start();
26            }

27        }

28
29        public void MethodRun()
30        {
31            log.Run(int.Parse(txtMaxCount.Text.Trim()));
32        }

33
34        private void log_ProgressEvent(int CurrNumber, string CurrText)
35        {            
36            progressBar1.Value =CurrNumber;
37            this.lboxEventLog.Items .Add(CurrText);                         
38        }

执行结果如图所示。
posted on 2006-01-14 10:38  Jin  阅读(1841)  评论(5编辑  收藏  举报