基于Roslyn的远程任务平台

前一段时间,有一个天真的想法。我想将一个Action或者Func传输到远程机器上执行。有很多问题。委托执行的上下文怎么复制。开始是想将委托所在的DLL和引用的DLL一起传输到远程机器上。这样一来,上下文环境不就有了吗。当然在GAC里的DLL就不用传输了,传输对象只限于自定义的DLL。可是这样做十分的麻烦也没有必要。后来在微软成立基金会的那天,偶然看到了Roslyn。它可以将一段字符串解析,编译。利用Rolyn的扩展,甚至可以直接执行一段字符串代码。太神奇了。于是就有了下面这个项目的想法。首先,先给各位看张图。看看我的大概思路。

  1. 首先,会发送一个消息对象到服务端监听程序。这个对象里包含有任务ID、要被动态编译的字符串代码、及引用的程序集(GAC中的不再其中)、路由信息。目前所有任务都是统一的一种处理方式,将字符串代码编译生成DLL。保存到本地文件系统中,然后经过一些列管道中自定义模块的处理。将任务信息最终分发到指定的进程中去处理。以后可能会添加其他的任务处理方式。比方说,不持久化生成DLL。直接将字符串代码经过Roslyn和其扩展动态执行。也可以不经过路由平台将任务分发到指定的进程中。暂时没有想到其他的。
  2. 其中应用到的设计理念有类似于Asp.Net路由机制、管道设计、对象池(每一个请求就会new一个RemoteTaskAppliction,为了减轻压力,所以就有了对象池的设计。如果对象池中的对象超过了对象池最大容量,那么该请求就会排队等待有对象被释放到池中再进行处理。)、对于请求的队列控制(和对象池搭配使用,只有当有空闲空对象可以进行处理的时候,才会将请求出队)。类似于IHttpModule的实现(在整个RemoteTaskApplication的生命周期内,定义了一系列的事件可供自定义的Module注册,达到对请求的控制。目前可能就有日志模块、安全模块)

这个项目还没完全写完。最后引用Github的一句话。Build software better, together。该项目,我已经放在github上。地址是 https://github.com/freestyleSago/RemoteTaskPlatform

这个项目呢,对我来说,它的锻炼目的大于它的实际价值。所以也希望各位大神多多指点。蒋金楠(Artech)老师真是太牛了。多看他的文章,相信大家也会有收获。目前Roslyn和C#6.0的资料都太少,不过我觉得,有了Roslyn就可以将C#变成脚本语言了。解析执行。也许意义不大,性能很差。但是很酷啊。也算是圆了我的一个梦啊,给你一段字符串,你就给我执行。

原文地址:https://www.cnblogs.com/Sago/p/3660451.html