这一次将很我们享用的是一个跨平台运行的服务插件 –
TaskCore.MainForm,此框架是应用.netcore来形容的,现在netcore已经辅助多系列平台运行了,所以将先的Task.MainForm改进成跨平台的服务同步我们用及互动互换;本来就篇应该分享的凡nginx+iis+redis+Task.MainForm构建分布式架构累作品,但使用.netcore来定义一个服务插件与跨平台测试经过被自家既兴奋而嫌,不说了下次复享受分布式后续小说吧;那么开前几天底分享内容,希望各位多多襄助:

 

. 框架结构介绍及运行效果图

. 咋样生成nuget包跟动开源框架TaskCore.MainForm

.
win7和ubuntu16.04运转TaskCore.MainForm的少种方法以及测试截图(也不过认为.netcore项目以win7和ubuntu系统运转的个别种植艺术)

. 框架代码解读及感悟

 

下一步一个脚印的来享受:

. 框架结构介绍和运行效果图

率先,咋们先来认识下项目源码的工目录结构使图:

json 1

组织看上去应该丰富清楚了,源码文件量也甚少,可是确实兑现了动态加载程序集dll来执行任务,前面会让来相应的执行截图,我们还来拘禁下TaskCore.MainForm项目通过vs2015转移之后Bin文件夹着之文书要图:

json 2

只要安了.netcore
sdk的言辞在windows上你就需要端截图的公文就可知运作插件了;再来大家在曾安装了core
sdk的win7系统及执行一下之类命令 dotnet
TaskCore.MainForm.dll 就会顾如图的意义:

json 3

 没错立时即是插件运行起来的功效图,因为.netcore现近日暂时没提供类似于winform这样的皮肤界面效果,所有只可以通过命令执行来开跨平台运行程序

 

**. 怎么样生成nuget包跟采取TaskCore.MainForm
**

先是,大家要是显著服务是由于简单片组成(TaskCore.MainFormTaskCore.Plugin);TaskCore.MainForm最紧要为此来运转程序,TaskCore.Plugin就此来作子任务急需继续的父类插件;当我们下载TaskCore.MainForm运行包之后(如图2协会),我们还亟需做的虽是后续TaskCore.Plugin.dl中的TPlugin这么些近乎,来再写自己之天职内容,因而我们新建一个品类命名为:TaskCore.Test,再来我们因此vs2015引用功用一贯上加TaskCore.MainForm运行包中的TaskCore.Plugin.dl引用,那么些时段会唤起一个谬误:

json 4

不当意思是无奈加载netcore版本的dll,由此这种直白在vs项目被援引情势添加dll看重不行,需要经nuget来上加依赖包(.netcore对类库的援方今不得不通过nuget来安装看重,那些需要注意),所以我此拿TaskCore.Plugin项目经 dotnet
pack 命令来生成nuget包,然后以便自己TaskCore.Test项目被来运;

**安生成nuget担保(**win7网dotnet命令来生成包的长河和下载):

直当vs中右键您得打包的类库项目-》选拔”在资源管理器中开辟文件夹”-》这样尽管到了卿类库的干净目录,然后退交类库根目录的直达顶尖文件夹着-》按停键盘”shift”键并同时鼠标右键要自包类库的品种文件件(我此是TaskCore.Plugin文件夹)-》选用“在此间打开命令窗体”
这些上即使上了cmd命令窗体,当然有些朋友平素喜欢一向先cmd再来找对应的磁盘,反正我看第一种更快点(不同人不同选项吧),下边看下操作截图:

json 5

由于达到图可以视,通过命令生成了nupkg文件,这文件就是咋们需要以档次遭到下载安装的TaskCore.Plugin插件包;接下去我们来当TaskCore.Test项目被安者插件如下步奏,右键TaskCore.Plugin项目中的“引用”-》采用“管理nuget程序包”-》然后选拔右上斗的之图标

json 6

-》采用“Nuget包管理器”-》“程序包源”-》

json 7

-》然后选用新成立的包源,下边设置如图

json 8

此间的“源(S)”指定的地面路径就是是刚刚我们其余nupkg文件文件的磁盘(当然我这边是吧刚才pack命令生成的文本复制到了MyNugPackage文件夹着好测试)-》然后点击”确定“按钮-》然后以回到到

json 9

选料大家的包源MyNugPackage-》再浏览这里虽可以看大家创设的nuget包了

json 10

-》接纳并安装-》好安装好后我们能够查看“引用”下边有了如下变化

json 11

以project.json文件被自动添加了借助项:

json 12

吓了至大家的TaskCore.Test项目中即得以Task.Plugin包里面的点子很类等新闻了;

**使用TaskCore.MainForm**:

鉴于地点的操作TaskCore.Test项目都设置了Task.Plugin包,那么我们当品种中分头成立3个子类并无冕自Task.Plugin包的父类TPlugin同等对待新写方法TPlugin_Load(),对诺文件名称分别吗:BlogsObj.cs,BlogsObj01.cs,BlogsObj02.cs,分别上参与下代码内容:

BlogsObj.cs:

 1 namespace TaskCore.Test
 2 {
 3     // This project can output the Class library as a NuGet Package.
 4     // To enable this option, right-click on the project and select the Properties menu item. In the Build tab select "Produce outputs on build".
 5     public class BlogsObj : TPlugin
 6     {
 7         public BlogsObj()
 8         {
 9 
10         }
11 
12         public override void TPlugin_Load()
13         {
14             var sbLog = new StringBuilder(string.Empty);
15             try
16             {
17                 sbLog.Append($"这里是BlogsObj,获取配置文件:{this.XmlConfig.Name}");
18 
19                 //代码块
20                 //
21 
22                 new WriteLog()._WriteLog($"{DateTime.Now}测试引用nuget包");
23 
24             }
25             catch (Exception ex)
26             {
27                 sbLog.Append($"异常信息:{ex.Message}");
28             }
29             finally
30             {
31 
32                 PublicClass._WriteLog(sbLog.ToString(), this.XmlConfig.Name);
33             }
34         }
35     }
36 }

BlogsObj01.cs:

json 13json 14

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using TaskCore.Plugin;
 7 
 8 namespace TaskCore.Test
 9 {
10     // This project can output the Class library as a NuGet Package.
11     // To enable this option, right-click on the project and select the Properties menu item. In the Build tab select "Produce outputs on build".
12     public class BlogsObj01 : TPlugin
13     {
14         public BlogsObj01()
15         {
16 
17         }
18 
19         public override void TPlugin_Load()
20         {
21             var sbLog = new StringBuilder(string.Empty);
22             try
23             {
24                 sbLog.Append($"这里是BlogsObj01,获取配置文件:{this.XmlConfig.Name}");
25 
26                 //代码块
27                 //
28             }
29             catch (Exception ex)
30             {
31                 sbLog.Append($"异常信息:{ex.Message}");
32             }
33             finally
34             {
35                 //Console.WriteLine($"这里是Blogs,获取配置文件:{this.XmlConfig.Name}");
36                 PublicClass._WriteLog(sbLog.ToString(), this.XmlConfig.Name);
37             }
38         }
39     }
40 }

View Code

BlogsObj02.cs:

json 15json 16

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Threading.Tasks;
 5 using TaskCore.Plugin;
 6 
 7 namespace TaskCore.Test
 8 {
 9     // This project can output the Class library as a NuGet Package.
10     // To enable this option, right-click on the project and select the Properties menu item. In the Build tab select "Produce outputs on build".
11     public class BlogsObj02 : TPlugin
12     {
13         public BlogsObj02()
14         {
15 
16         }
17 
18         public override void TPlugin_Load()
19         {
20             //Console.WriteLine($"这里是Blogs,获取配置文件:{this.XmlConfig.Name}");
21             PublicClass._WriteLog($"这里是BlogsObj02,获取配置文件:{this.XmlConfig.Name}", this.XmlConfig.Name);
22         }
23     }
24 }

View Code

吓了测试代码写了,咋们生成一下,然后拿此TaskCore.Test.dll拷贝到TaskCore.MainForm运行包中,还得在PluginXml文本夹着分别创设继承TPlugin的子类的配置文件对应的截图而(注:这里xml配置文件名称必须同子类名称一致):

json 17

安排文件内容一经BlogsObj.xml

 1 <!--
 2   1.xml配置模板
 3   2.utf-8文件
 4   3.复制到程序根目录下面PluginXml文件夹下
 5   4.每个任务建议创建和程序dll名称相同xml配置文件
 6 -->
 7 <TaskMain>
 8   <!--固定:执行任务时间计时器(分钟)-->
 9   <Timer>1</Timer>
10   <!--固定:任务名称-->
11   <Name>获取博客信息</Name>
12   <!--固定:账号-->
13   <UserName></UserName>
14   <!--固定:密码-->
15   <UserPwd></UserPwd>
16   <!--固定:key-->
17   <ApiKey></ApiKey>
18   <!--固定:key-->
19   <ApiUrl></ApiUrl>
20   <!--固定:是否关闭任务 1:是 0:否-->
21   <CloseTask>0</CloseTask>
22   
23 <!--固定:描述-->
24   <Des>获取博客信息</Des>
25   <!--自定义:其他配置信息-->
26   <Other>
27     <ShenNiuBuXing3>神牛步行3</ShenNiuBuXing3>
28   </Other>
29 </TaskMain>

最后在CrossFiles.xml部署文件中上加TaskCore.Test.dll文件名称如:

1 <!--
2   CrossFiles指定对应任务的dll文件,必须存在的文件
3 -->
4 <TaskMain>
5   <File>TaskCore.Test.dll</File>
6 </TaskMain>

好了形成了,我们在windows开发环境达到运行看下效果图:

json 18

及此地我们来简单总计下怎么利用TaskCore.MainForm插件,在祥和种遭到安装TaskCore.Plugin的nuget包-》重写父类TPlugin的TPlugin_Load()方法-》变自己的型,拷贝项目的dll到TaskCore.MainForm运行包中-》于运作包中PluginXml文件夹着长任务子类相同类名的xml文件并配备如齐之配置信息-》增添CrossFiles.xml中之职责dll文件配置**-》运命令 dotnet
TaskCore.MainForm.dll 运行服务插件**,挺简单的吧

 

.
win7和ubuntu16.04运行TaskCore.MainForm的点滴种艺术及测试截图(也可认为.netcore项目以win7和ubuntu系统运转的片种植方法)

 由于环境影响,这里过平台运行测试自己偏偏测试win7ubuntu16.04,其他系统的公布测试希望恋人等在动过程中赢得结果报告自己下谢谢;先来发话在win7中运行

1. 装了netcore sdk环境的昭示运行

设置了sdk后一贯可以当cmd命令中 dotnet
TaskCore.MainForm.dll 来运转服务,开篇下边讲解的示范都是在安装了sdk后底截图,服务运作所急需之文本要图:

json 19

json,纵使唯有那一个文件(当然程序要的一些平台因项下的是装之sdk中的文件,所以看起特别少实际应包含netcore
sdk里面的文本才可以运行),通过命令运行的功用图:

 json 20

2. 休设置netcore sdk环境的发布运行

当啊安sdk平台上系统上运行才是任重而道远,那样才得说凡是越平台;首先,为了更好看效果我们复制一份如图的点滴只文本及TaskCore.MainForm01文件夹着:

json 21

不错,只待霎时半只公文,然后我们用修改project.json文件的情如下注释的地点:

 1 {
 2   "version": "1.0.0-*",
 3   "buildOptions": {
 4     "emitEntryPoint": true
 5   },
 6 
 7   "dependencies": {
 8     "Microsoft.NETCore.App": {
 9       //"type": "platform",    跨平台发布需要注释
10       "version": "1.0.0"
11     },
12     "System.IO.FileSystem": "4.0.1",
13     "System.Reflection": "4.1.0",
14     "System.Text.Encoding.CodePages": "4.0.1",
15     "System.Threading.Timer": "4.0.1",
16     "System.Xml.XDocument": "4.0.11",
17     "TaskCore.Plugin": "1.0.0"
18   },
19 
20   "frameworks": {
21     "netcoreapp1.0": {
22       "imports": "dnxcore50"
23     }
24   },
25   //跨平台发布需要添加如下节点
26   "runtimes": {
27     "ubuntu.16.04-x64": { }, //运行在ubuntu.16.04的64位系统
28     "win7-x64": { }    //运行在win7的64位系统
29   }
30 }

接下来使cmd分别录入并回车运行指令 dotnet
restore 此时TaskCore.MainForm01文件夹着会面自动生成一个project.lock.json文件(我们小心看下),然后又录入指令 dotnet publish -r
win7-x64 ,可以见到令窗新闻如果:

json 22

不畏意味着成功了,并且有归生成运行文件之路,我们仍路径找到变化的文本publish文件夹,里面没PluginXml配置文件夹和安排文件和测试项目TaskCore.Test.dll,大家为有利于间接复制下面配置好的安排文件及publish文件夹着如下截图就是变的通知文件:

json 23

没错TaskCore.MainForm01.exe斯就是是自动生成的周转文件,然后大家双击运行效果图:

 json 24

运作成功了,有情侣会问你事先系统不是设置了sdk么,这种测试可以算么,我眷恋说的凡者自通过QQ发给qq群里面的情人@南宫亦琦(不要老我贴发了而的昵称)测试了了,她没安装了sdk的;

ubuntu16.04运行:

1. 设置了netcore sdk环境的揭橥运行

先是,大家得把在win7上转的门类复制到ubuntu系统磁盘中(我们拔取方面配置好的TaskCore.MainForm包),我这里运用共享目录的计将公文拷贝到ubuntu系统磁盘上,如图:

json 25

然后,鼠标右键点击空白地点,采纳“在终端打开”,然后于窗体中录入如下指令 dotnet
TaskCore.MainForm.dll ,能看到如下运行从底结果:

json 26

此令道是勿是生上面win7上之方特别一致,本来就是是一致的,只要安装了.netcore
sdk这种情势几乎可联手用

2. 未设置netcore sdk环境之公告运行

 不装sdk环境运行才是咋们需要关怀的,下面就来拘禁下怎么变卦再ubuntu系统上可以运行的文书;大家复制一客下边的TaskCore.MainForm01项目到TaskCore.MainForm02中来测试,由于事先我们在讲生成win7执行文书时,执行了指令 dotnet restore 和 dotnet publish -r
win7-x64 命令所以文件被起project.lock和bin文件夹,为了测试我们得去掉一部分文件,只剩下如图文件,这里用留意的是前边已经配备了project.xml我们随便需在改动了:

json 27

下一场,分别执行和生成win7运行文件几乎千篇一律之命 dotnet restore 和 dotnet publish -r ubuntu.16.04-x64 不同之处在于转变的文本存放的职务不同和动的周转环境不同,运行结果使图:

json 28

publish文件夹着之公文就是在ubuntu系统举办的文件,然后咱们要把任务部署文件夹PluginXml测试项目TaskCore.Test.dll复制到拖欠目录中,再来咋们通过共享吧TaskCore.MainForm02目录中之publish复制到ubuntu中;然后我们需要将TaskCore.MainForm02可执行文件装下权限,鼠标右键点击TaskCore.MainForm02可执行文件,选择“属性”,再选择“权限”选项卡,勾选“容作为程序执行”,如图:

json 29

接下来,大家右键文件夹着空白处,采取“于终极打开”,再实施如下命令 ./TaskCore.MainForm02 ,最终看运行效果图:

json 30

哼了,发表于ubuntu系统及实施文书和运转的步奏就这一个,几乎跟win7上等同

 

. 框架代码解读与感悟

岂利用跨平台TaskCore.MainForm任务框架讲解了了,下面来具体看下要代码Program.cs文件中:

  1 namespace TaskCore.MainForm
  2 {
  3     /// <summary>
  4     /// author 神牛步行3
  5     /// contact 841202396@qq.com
  6     /// des TaskCore.MainForm跨平台插件由神牛步行3提供
  7     /// </summary>
  8     public class Program
  9     {
 10 
 11         private static Dictionary<string, MoAssembly> dicTasks = new Dictionary<string, MoAssembly>();
 12 
 13         public static void Main(string[] args)
 14         {
 15             //注册编码,防止乱码
 16             Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
 17 
 18             //初始化程序集文件
 19             _Init();
 20 
 21             //是否继续开启任务,默认没有待执行任务,不提示
 22             if (dicTasks.Count <= 0) { _LoopAlert("是否退出?(Y/N)"); return; }
 23             _LoopAlert("是否开始执行任务?(Y / N)");
 24 
 25             //执行任务
 26             foreach (var item in dicTasks.Values)
 27             {
 28                 //使用Task防止异常后相互影响
 29                 Task.Run(() =>
 30                 {
 31                     try
 32                     {
 33 
 34                         //创建任务对象
 35                         var tp = item.Asm.CreateInstance(item.FullName) as TPlugin;
 36                         if (!string.IsNullOrEmpty(tp.XmlConfig.TpError)) { _Alert($"{DateTime.Now.ToString("yyyy/MM/dd HH:mm")}:{tp.XmlConfig.Name} - 异常信息:{tp.XmlConfig.TpError}"); }
 37                         else
 38                         {
 39 
 40                             //timer定时器
 41                             var timer = new Timer((param) =>
 42                             {
 43                                 var msg = $"{DateTime.Now.ToString("yyyy/MM/dd HH:mm")}:{tp.XmlConfig.Name}";
 44                                 try
 45                                 {
 46                                     var tpObj = param as TPlugin;
 47                                     //是否关闭暂停任务
 48                                     if (tpObj.XmlConfig.CloseTask) { return; }
 49                                     _Alert($"{msg} - 开始执行...{tp.XmlConfig.Timer}分钟一次");
 50                                     //任务入口
 51                                     tpObj.TPlugin_Load();
 52                                 }
 53                                 catch (Exception ex) { _Alert($"{msg} - 异常信息:{ex.Message}"); }
 54                             }, tp, 0, 1000 * 60 * tp.XmlConfig.Timer);
 55                         }
 56 
 57                     }
 58                     catch (Exception ex)
 59                     {
 60                         _Alert($"{DateTime.Now.ToString("yyyy/MM/dd HH:mm")}:{item.Name} - 异常信息:{ex.Message}");
 61                     }
 62                 });
 63             }
 64             _LoopAlert("正在监控执行的任务,是否退出?(Y / N)");
 65         }
 66 
 67         /// <summary>
 68         /// 初始化程序集文件
 69         /// </summary>
 70         private static void _Init()
 71         {
 72             try
 73             {
 74 
 75                 _Alert("初始化任务中...");
 76                 //获取文件
 77                 var files = PublicClass._GetPluginFile("");
 78                 if (files.Length <= 0) { _Alert("未能找到可用的程序集,请检查配置"); return; }
 79 
 80                 //读取任务文件
 81                 _Alert("读取CrossFiles.xml配置中...");
 82                 var baseAddr = Path.Combine(Directory.GetCurrentDirectory(), "PluginXml", "CrossFiles.xml");
 83                 var doc = XDocument.Load(baseAddr);
 84                 var fileables = files.AsEnumerable();
 85                 var taskFiles = new List<FileInfo>();
 86                 foreach (var item in doc.Root.Nodes())
 87                 {
 88                     var crossFile = item.ToString().ToUpper();
 89                     var choiceFiles = fileables.Where(b => crossFile.Contains(b.Name.ToUpper()));
 90                     if (!choiceFiles.Any()) { continue; }
 91 
 92                     taskFiles.AddRange(choiceFiles);
 93                 }
 94 
 95                 //展示文件信息
 96                 _Alert($"待遍历{taskFiles.Count}个文件信息...");
 97                 foreach (var item in taskFiles.OrderBy(b => b.CreationTime))
 98                 {
 99                     var asmName = new AssemblyName($"{item.Name.Replace(".dll", "")}");
100                     Assembly sm = Assembly.Load(asmName);
101                     if (sm == null) { continue; }
102                     var ts = sm.GetTypes();
103                     //判断特定的任务类,加入任务dic
104                     foreach (var t in ts.Where(b => b.Name != "TPlugin" && b.GetMethod("TPlugin_Load") != null))
105                     {
106 
107                         dicTasks.Add(
108                             t.FullName,
109                             new MoAssembly
110                             {
111                                 Asm = sm,
112                                 FullName = t.FullName,
113                                 Name = t.Name
114                             });
115                     }
116                 }
117                 _Alert($"获取待执行任务量:{dicTasks.Count}个");
118             }
119             catch (Exception ex)
120             {
121                 _Alert($"异常信息:{ ex.Message}");
122             }
123         }
124 
125         /// <summary>
126         /// 消息提醒
127         /// </summary>
128         /// <param name="msg">提示信息</param>
129         /// <param name="isReadLine">是否需要用户输入指令</param>
130         /// <returns>用户录入的指令</returns>
131         private static string _Alert(string msg = "神牛步行3-消息提醒", bool isReadLine = false)
132         {
133             Console.WriteLine(msg);
134             if (isReadLine) { return Console.ReadLine(); }
135             return "";
136         }
137 
138         private static void _LoopAlert(string msg = "是否开始执行任务?(Y/N)")
139         {
140             do
141             {
142                 var readKey = _Alert(msg, true);
143                 if (readKey.ToUpper().Contains("Y")) { break; }
144             } while (true);
145         }
146     }
147 
148     public class MoAssembly
149     {
150         public Assembly Asm { get; set; }
151         public string FullName { get; set; }
152 
153         public string Name { get; set; }
154     }
155 }

TPlugin.cs文件被代码:

json 31json 32

  1 using System;
  2 using System.Collections.Generic;
  3 using System.IO;
  4 using System.Linq;
  5 using System.Threading.Tasks;
  6 using System.Xml.Linq;
  7 
  8 namespace TaskCore.Plugin
  9 {
 10     /// <summary>
 11     /// 插件基类
 12     /// </summary>
 13     public class TPlugin : IDisposable
 14     {
 15 
 16         public TPlugin()
 17         {
 18 
 19             XmlConfig = _InitConfig();
 20         }
 21 
 22         #region  初始化Xml配置文件 _InitConfig +XmlConfig
 23 
 24         /// <summary>
 25         /// xml配置信息
 26         /// </summary>
 27         public XmlConfig XmlConfig;
 28 
 29 
 30         /// <summary>
 31         /// 初始化配置信息
 32         /// </summary>
 33         /// <param name="configPath">配置文件对应路径</param>
 34         /// <returns></returns>
 35         public virtual XmlConfig _InitConfig(string configPath = "")
 36         {
 37             XmlConfig config = new XmlConfig();
 38             config.Timer = 1;
 39             config.Name = this.GetType().Name;
 40             try
 41             {
 42 
 43                 if (string.IsNullOrEmpty(configPath))
 44                 {
 45 
 46                     //默认各个dllXml配置
 47                     var defaultConfigFolder = "PluginXml";
 48                     var baseAddr = Directory.GetCurrentDirectory();
 49                     configPath = Path.Combine(baseAddr, defaultConfigFolder, config.Name + ".xml");
 50                 }
 51 
 52                 var doc = XDocument.Load(configPath);
 53                 config.doc = doc;
 54                 var taskMain = doc.Root;
 55 
 56                 config.Timer = Convert.ToInt32(taskMain.Element(XName.Get("Timer", "")).Value);
 57                 config.Name = taskMain.Element(XName.Get("Name", "")).Value;
 58                 config.Des = taskMain.Element(XName.Get("Des", "")).Value;
 59 
 60                 config.UserName = taskMain.Element(XName.Get("UserName", "")).Value;
 61                 config.UserPwd = taskMain.Element(XName.Get("UserPwd", "")).Value;
 62                 config.ApiKey = taskMain.Element(XName.Get("ApiKey", "")).Value;
 63                 config.ApiUrl = taskMain.Element(XName.Get("ApiUrl", "")).Value;
 64                 config.CloseTask = taskMain.Element(XName.Get("CloseTask", "")).Value == "1";
 65 
 66             }
 67             catch (Exception ex)
 68             {
 69                 config.TpError = ex.Message;
 70                 PublicClass._WriteLog($"{config.Name}初始化配置信息异常:{ex.Message}", "BaseLog");
 71                 throw new Exception(ex.Message);
 72             }
 73             return config;
 74         }
 75         #endregion
 76 
 77         #region 初始化-开始加载  _Load
 78 
 79         /// <summary>
 80         /// 初始化-开始起
 81         /// </summary>
 82         public virtual void TPlugin_Load()
 83         {
 84 
 85             PublicClass._WriteLog("测试");
 86         }
 87 
 88         #endregion
 89 
 90         #region 释放资源
 91 
 92         public void Dispose()
 93         {
 94 
 95             GC.SuppressFinalize(this);//不需要再调用本对象的Finalize方法
 96         }
 97 
 98         public virtual void Dispose(Action action)
 99         {
100 
101             action();
102         }
103 
104         #endregion
105     }
106 
107     #region 配置文件 XmlConfig
108 
109     public class XmlConfig
110     {
111         public XmlConfig()
112         {
113 
114         }
115 
116         /// <summary>
117         /// 定制器时间(分钟)
118         /// </summary>
119         public int Timer { get; set; }
120 
121         /// <summary>
122         /// 运行名称
123         /// </summary>
124         public string Name { get; set; }
125 
126         /// <summary>
127         /// 描述(第一次获取dll描述,后面获取xml配置文件描述)
128         /// </summary>
129         public string Des { get; set; }
130 
131         /// <summary>
132         /// 接口账号
133         /// </summary>
134         public string UserName { get; set; }
135 
136         /// <summary>
137         /// 接口密码
138         /// </summary>
139         public string UserPwd { get; set; }
140 
141         /// <summary>
142         /// 接口秘钥
143         /// </summary>
144         public string ApiKey { get; set; }
145 
146         /// <summary>
147         /// 接口地址
148         /// </summary>
149         public string ApiUrl { get; set; }
150 
151         /// <summary>
152         /// 是否关闭任务
153         /// </summary>
154         public bool CloseTask { get; set; }
155 
156         /// <summary>
157         /// 插件中错误
158         /// </summary>
159         public string TpError { get; set; }
160 
161 
162         /// <summary>
163         /// xml信息
164         /// </summary>
165         public XDocument doc { get; set; }
166     }
167 
168     #endregion
169 }

View Code

切切实实的注明和逻辑处理代码中都爆发注释,各位好详细看下;那里而诉说的是欠框架紧要原理是动态加载任务dll来成立对象,netcore的顺序集类Assembly不像framework里面的Assembly一样那么多可为此智,我这边用之 Assembly.Load() ,netcore只可以加载当前网根目录的dll(这里我花了几独刻钟测试,有例外结果的爱人,请登时交流我谢谢),框架下 Task.Run() 方法创制不同任务,实现并行执行的效率,并且逐一容易错地点以try…catch来容错,避免了有块头任务很后,导致框架全部戛不过止运行,个人认为其实依旧不易的是吧;

脚被出几乎只不同条件下之压缩包,以供应役使及参照:

TaskCore.MainForm-纯文件  TaskCore.MainForm01 git源码地址

 

相关文章

网站地图xml地图