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

这个类是放在Bussiness层的数据处理类:
下面这段是在UI层的某Form的执行代码:
执行结果如图所示。
比如,Bussiness层中要对n条数据进行foreach的逐条处理,需要在WinUI层的某Form中看到对应的状态提示,包括进度条progressBar,同时ListBox中也要有对每条记录的处理状态进行提示。
我不提倡将progressBar等对象传递到Bussiness层,这样耦合太强。
也不提倡在WinUI方用Timer等轮训去查Bussiness层中的执行状态,这样负载大,同时有漏掉某些状态提示。
采用事件触发方式,可以完美的解决这个问题。
下面是示例,图是我们需要的效果:

这个类是放在Bussiness层的数据处理类:
1
using System;
2
using System.Threading;
3
4
namespace 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
using System;2
using System.Threading;3

4
namespace WinTest5
{6
public delegate void ProgressEventHandler(int CurrNumber,string CurrText);7
/// <summary>8
/// EventLog 的摘要说明。9
/// </summary>10
public class EventLog11
{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的执行代码:
1
private EventLog log;
2
public 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
}
15
private 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
}
private EventLog log;2
public 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
}15
private 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
}执行结果如图所示。


浙公网安备 33010602011771号