上一节咱们处理了界面逝世锁的成绩,参考:C#文雅编程之变乱体系:(二)入门级
然而假如有100个相似的功效,该怎样计划这个类呢?
起首咱们须要做的就是新建一个FileSearch类,把什么代码都放在界面类中处置终归是成不了体系。
稍作收拾后,咱们失掉的成果应当是上面的图示:
logs是表现信息到输入框;tip是表现信息到label控件,这两个函数都是要跟界面交互的,难不成我须要在类中申明一个Form工具?然而每个界面临这些变乱的处置都差别,假如是读取内容呢?假如是写入内容呢?…. 能够说,处置方法有良多种,咱们是无奈穷举的,以是这里咱们须要的应当是一个函数变量,咱们能够在挪用查问条件前设置好这些函数变量,当这些变乱到来的时间,静态挪用这些函数就好了,咱们把这种平日叫回调函数。
这里咱们须要引进一个要害字,Action,这个特地就是用来申明回调函数的,咱们按F12能够看到它的申明,实在就是delegate,代办。
比方分辨申明带参数跟不带函数的变量:
Action fun_no_param;
Action<string> fun_has_param;
挪用时:
fun_no_param();
fun_has_param("hello");
这个就能够完善处理上一节咱们提出的成绩了,我不仅要在挪用的时间指定这些函数的挪用去处,等查问到内容时,就主动挪用到我指定的函数中了。无论当前有几多挪用的处所,不仅要挪用之前指定好了就能够。
于是咱们持续做改良打算:
FileSearch类代码:
public class FileSearch
{
public Action<object>? file_found;
public Action<object>? folder_found;
public Action<object>? search_begin;
public Action<object>? search_end;
public Action<object>? search_exception;
public string file_ext = "";
public async void CallSearch(string root_folder)
{
DirectoryInfo di = new DirectoryInfo(root_folder);
if (search_begin != null) search_begin(this);
await SearchAllFiles(di);
if (search_end != null) search_end(this);
}
async Task SearchAllFiles(DirectoryInfo di)
{
try
{
if (folder_found != null) folder_found(di);
FileInfo[] files = di.GetFiles(file_ext);
foreach (FileInfo fi in files)
{
if (file_found != null) file_found(fi);
}
await Task.Delay(1);
DirectoryInfo[] direct = di.GetDirectories();
foreach (DirectoryInfo diTemp in direct)
{
await SearchAllFiles(diTemp);
}
}
catch (欧易交易所Exception ex)
{
if (search_exception != null) search_exception(ex);
}
}
}
对5个变乱分辨申明5个Action。
Form挪用:
public void logs(string msg)
{
tbxLog.AppendText(msg + "\r\n");
}
public void tip(string msg)
{
lblTip.Text = msg;
}
void file_found(object o)
{
FileInfo fi = (FileInfo)o;
if (fi.FullName.Contains(find_str))
{
logs(fi.FullName);
}
tip(fi.FullName);
file_count++;
}
void folder_found(object o)
{
DirectoryInfo di = (DirectoryInfo)o;
tip(di.FullName);
file_count++;
}
void search_begin(object o)
{
logs("开端");
find_str = "估算";
file_count = 0;
}
void search_end(object o)
{
logs(string.Format("停止。检索文件数目:{0}", file_count));
}
void search_exception(object o)
{
Exception ex = (Exception)o;
logs(ex.Message);
}
public int file_count = 0;
public string find_str = "";
private void btnLevel1_Click(object sender, EventArgs e)
{
FileSearch fs = new FileSearch();
string root_fold欧易交易所er = "C:\\test";
fs.file_ext = "*.xls";
fs.file_found = file_found;
fs.folder_found = folder_found;
fs.search_begin = search_begin;
fs.search_end = search_end;
fs.search_e欧易交易所xception = search_exception;
fs.CallSearch(root_fo欧易交易所lder);
}
挪用前分辨设置5个变乱的回调函数,触发变乱后,就分辨回调咱们指定的函数。这种方法无论当前须要裁减几多处置方法,不仅要换回调函数就好了,FileSearch外部的代码就不须要再动了。假如当前须要在FileSearch中加功效或改Bug,也不仅须要修改FileSearch这一个文件就全体失效了。
这种方法比拟入门级,机动性上有了很年夜的晋升,按我的评判尺度,能够称之为体系了,然而离文雅还不敷。此次咱们处理的是文件批量搜寻,那下次咱们做一个爬虫体系,也须要有相似的变乱处置机制,我就还得须要再界说相似这些变乱;而后我要计划一套新闻体系,有100种新闻,岂非我要申明100个Action变量吗?显然有些愚笨了。欧易交易所
为了文雅,咱们还须要持续退化。欲知后事怎样,且请君存眷我,不迷路,下节持续:)
————-
说个题外话,第二节碰到一欧易交易所个网友对我的代码提成质疑,一说不是异步,二说都堆在UI线程不敷文雅。我明显讲的是变乱体系,他的存眷点却盯在UI线程,头脑不在一个层面的相同起来真是累。我想跟各人说的是:对于异步以及多线程,前面会开文章来讲。别的,有了文雅计划的基本,想改成什么不都是多少行代码的事吗,又何须纠结呢?
还没有评论,来说两句吧...