在项目架构时,首先我们会考虑采用WINUI层与Bussiness层分离的N层结构。那么在WinUI层与Bussiness层之间一些动态提示,可采用Event来实现。
比如,Bussiness层中要对n条数据进行foreach的逐条处理,需要在WinUI层的某Form中看到对应的状态提示,包括进度条progressBar,同时ListBox中也要有对每条记录的处理状态进行提示。
我不提倡将progressBar等对象传递到Bussiness层,这样耦合太强。
也不提倡在WinUI方用Timer等轮训去查Bussiness层中的执行状态,这样负载大,同时有漏掉某些状态提示。
采用事件触发方式,可以完美的解决这个问题。
下面是示例,图是我们需要的效果:
![](/images/cnblogs_com/jinqin/EventTest.jpg)
这个类是放在Bussiness层的数据处理类:
下面这段是在UI层的某Form的执行代码:
执行结果如图所示。
比如,Bussiness层中要对n条数据进行foreach的逐条处理,需要在WinUI层的某Form中看到对应的状态提示,包括进度条progressBar,同时ListBox中也要有对每条记录的处理状态进行提示。
我不提倡将progressBar等对象传递到Bussiness层,这样耦合太强。
也不提倡在WinUI方用Timer等轮训去查Bussiness层中的执行状态,这样负载大,同时有漏掉某些状态提示。
采用事件触发方式,可以完美的解决这个问题。
下面是示例,图是我们需要的效果:
![](/images/cnblogs_com/jinqin/EventTest.jpg)
这个类是放在Bussiness层的数据处理类:
1
using System;
2
using System.Threading;
3![](/Images/OutliningIndicators/None.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
14
public EventLog()
15
{
16
//
17
// TODO: 在此处添加构造函数逻辑
18
//
19
}
20![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
28
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
29
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
30
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
31
![](/Images/OutliningIndicators/None.gif)
下面这段是在UI层的某Form的执行代码:
1
private EventLog log;
2
public Form1()
3
{
4
//
5
// Windows 窗体设计器支持所必需的
6
//
7
InitializeComponent();
8![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/None.gif)
29
public void MethodRun()
30
{
31
log.Run(int.Parse(txtMaxCount.Text.Trim()));
32
}
33![](/Images/OutliningIndicators/None.gif)
34
private void log_ProgressEvent(int CurrNumber, string CurrText)
35
{
36
progressBar1.Value =CurrNumber;
37
this.lboxEventLog.Items .Add(CurrText);
38
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
27
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
28
![](/Images/OutliningIndicators/None.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
33
![](/Images/OutliningIndicators/None.gif)
34
![](/Images/OutliningIndicators/None.gif)
35
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
执行结果如图所示。