2014年5月26日 10:26:31 晴

  • ASP.NET 接收到对应用程序中任何资源的第一个请求时,名为ApplicationManager 的类会创建一个应用程序域。应用程序域为全局变量提供应用程序隔离,并允许单独卸载每个应用程序。
  • 在应用程序域中,将为名为 HostingEnvironment 的类创建一个实例,该实例提供对有关应用程序的信息(如存储该应用程序的文件夹的名称)的访问
  • 为每个请求创建asp.net核心对象。Httpcontext ,HttpRequest, HttpResponse.
  • 将httpapplication对象分配给请求。

Orchard just begin#

protected void Application_Start() {
RegisterRoutes(RouteTable.Routes);
_starter = new Starter<IOrchardHost>(HostInitialization, HostBeginRequest, HostEndRequest);
_starter.OnApplicationStart(this);
}

其中泛型类Starter的定义如下

public Starter(Func<HttpApplication, T> initialization, Action<HttpApplication, T> beginRequest, Action<HttpApplication, T> endRequest) {}
OnApplicationStart-->
//Run the initialization delegate asynchronously in a queued work item
public void LaunchStartupThread(HttpApplication application)

http://www.codeproject.com/Articles/4201/Proper-Threading-in-Winforms-NET

/// <summary>
/// Run the initialization delegate asynchronously in a queued work item
/// </summary>
public void LaunchStartupThread(HttpApplication application) {
// Make sure incoming requests are queued
WarmupHttpModule.SignalWarmupStart();
ThreadPool.QueueUserWorkItem(
state => {
try {
var result = _initialization(application);
_initializationResult = result;
}
catch (Exception e) {
lock (_synLock) {
_error = e;
_previousError = null;
}
}
finally {
// Execute pending requests as the initialization is over
WarmupHttpModule.SignalWarmupDone();
}
});
}

此函数会使所有扩展模块的初始化委托异步、队列化执行。

先用WarmupHttpModules初始化一个全局静态Action列表,来存储初始化委托,并且无论如何在稍后的异步调用中执行action。

总之,Application_Start函数主要作用就是对所有可用扩展的异步队列初始化,其中异步与队列的功能由Orchard.WarmupStarter.Starter类来完成,而可用扩展的初始化加载由IOrchardHost来完成,其中扩展包括:module,core,theme以及子站点的概念。

异步委托

ThreadPool.QueueUserWorkItem(...)##

线程池在首次创建 ThreadPool 类的实例时被创建。线程池具有每个可用处理器 25 个线程的默认限制,这可以使用 mscoree.h 文件中定义的 CorSetMaxThreads 来更改。每个线程使用默认的堆栈大小并按照默认的优先级运行。每个进程只能具有一个操作系统线程池。

ThreadPool提供的公共方法都是static方法,因此也不需要生成ThreadPool对象。通过QueueUserWorkItem方法在线程池中添加一个工作项目后,目前没有提供简单的方法取消。你不必建立咨监线程,只需要把相应的函数或方法依托WaitCallback委托传递给ThreadPool.QueueUserWorkItem()方法即可。而线程的创建、管理和运行等等都由系统自动完成,这就是ThreadPool的优点。

*eg: the different between threadpool with normal thread *

delegate void ShowProgressDelegate ( int totalMessages, int messagesSoFar, bool statusDone );
private void button1_Click(object sender, System.EventArgs e)
{
ShowProgressDelegate showProgress = new
ShowProgressDelegate(ShowProgress);
int imsgs = 100;
if ( cbThreadPool.Checked )
{
object obj = new object[] { this, showProgress, imsgs };
WorkerClass wc = new WorkerClass();
bool rc = ThreadPool.QueueUserWorkItem( new WaitCallback
(wc.RunProcess), obj);
EnableButton( ! rc );
}
else
{
//another way.. using straight threads
//WorkerClass wc = new WorkerClass( this, showProgress, imsgs);
WorkerClass wc = new WorkerClass( this,
showProgress, new object[] { imsgs } );
Thread t = new Thread( new ThreadStart(wc.RunProcess));
//make them a daemon - prevent thread callback issues
t.IsBackground = true;
t.Start();
EnableButton ( false );
}
}

可变长数组参数###

public WorkerClass ( ContainerControl sender, Delegate senderDelegate, **params object[] list**);

params 构造函数声明数组 而不知道数组长度 用的

在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。

Orchard 源码探索(Application_Start)之异步委托调用的更多相关文章

  1. Orchard 源码探索(Log)

    简单工厂模式.抽象工厂模式和适配器模式 依赖倒置原则也叫依赖倒转原则,Dependence Inversion Principle,对抽象进行编程,不要对实现进行编程. A.高层次的模块不应该依赖于低 ...

  2. Orchard 源码探索(Module,Theme,Core扩展加载概述)

    参考: http://www.orchardch.com/Blog/20120830071458 1. host.Initialize(); private static IOrchardHost H ...

  3. Orchard 源码探索(Localization)之国际化与本地化

    本地化与国际化 基本上相关代码都在在Orchard.Framework.Localization中. T("english")是如何调用到WebViewPage.cs中的Local ...

  4. Golang源码探索(二) 协程的实现原理(转)

    Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱,虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底 ...

  5. Orchard源码分析(5):Host相关(Orchard.Environment.DefaultOrchardHost类)

    概述 Host 是应用程序域级的单例,代表了Orchard应用程序.其处理应用程序生命周期中的初始化.BeginRequest事件.EndRequest事件等. 可以简单理解为HttpApplicat ...

  6. wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...

  7. Eureka源码探索(一)-客户端服务端的启动和负载均衡

    1. Eureka源码探索(一)-客户端服务端的启动和负载均衡 1.1. 服务端 1.1.1. 找起始点 目前唯一知道的,就是启动Eureka服务需要添加注解@EnableEurekaServer,但 ...

  8. Golang源码探索(三) GC的实现原理(转)

    Golang从1.5开始引入了三色GC, 经过多次改进, 当前的1.9版本的GC停顿时间已经可以做到极短.停顿时间的减少意味着"最大响应时间"的缩短, 这也让go更适合编写网络服务 ...

  9. Golang源码探索(一) 编译和调试源码(转)

    GO可以说是近几年最热门的新兴语言之一了, 一般人看到分布式和大数据就会想到GO,这个系列的文章会通过研究golang的源代码来分析内部的实现原理,和CoreCLR不同的是, golang的源代码已经 ...

随机推荐

  1. linux下Java环境的配置

    linux下Java环境的配置 现在用linux的朋友越来越多了,前几天就有两个朋友问我linux下怎么配置java环境,我想还有很多朋友想了解学习这方面的东西,就写一个完全一点的linux java ...

  2. linux 链接控制

    如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,vim /etc/sysctl.conf编辑文件,加入以下内容:net.ipv4.tcp_syncookies = 1net.ip ...

  3. Apache-Tomcat 和 Apache-Maven配置

    1.1.下载安装文件 官网对应版本下载,例:apache-tomcat-8.0.35-windows-x64.zip 1.2.指定对应的安装目录: 例:D:\JavaSoft\apache-tomca ...

  4. apache配置重写

    linux环境下 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d Rewrite ...

  5. Scrapy的架构初探

    Scrapy,Python开发的一个web抓取框架. 1,引言 Python即时网络爬虫启动的目标是一起把互联网变成大数据库.单纯的开放源代码并不是开源的全部,开源的核心是“开放的思想”,聚合最好的想 ...

  6. Mybatis基础入门 I

    作为ORM的重要框架,MyBatis是iBatis的升级版.Mybatis完全将SQL语句交给编程人员掌控,这点和Hibernate的设计理念不同(至于Hibernate的理念,待我先学习学习). 下 ...

  7. java转换字符串的编码(转)

    package com.Alex.base; import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */ public class C ...

  8. hdu2795线段树

    //=========================================== //segment tree //final version //by kevin_samuel(fenic ...

  9. Java WebService把Date类型转换成XMLGregorianCalendar

    JavaEE 的WebService中的Date类型在Web应用中调set方法的时候,默认情况下,JAXB将xsd:date, xsd:time, 和xsd:dateTime映射为XMLGregori ...

  10. javaScript滚动新闻之上下左右平滑滚动

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...