博文

ASP.NET 中配置节点SessionState的用法(2012-12-18 10:01:00)

摘要:这一段就是配置应用程序是如何存储Session信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。sessionState节点的语法是这样的: 
   
  <sessionState mode="Off|InProc|StateServer|SQLServer" 
   cookieless="true|false" 
   timeout="number of minutes" 
   stateConnectionString="tcpip=server:port" 
   sqlConnectionString="sql connection string" 
   stateNetworkTimeout="number of seconds" 
  /> 
   
   
  必须有的属性是 
   
  属性 选项 描述 
  mode 设置将Session信息存储到哪里 
   Off 设置为不使用Session功能 
   InProc 设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。 
   StateServer 设置为将Se......

阅读全文(2637) | 评论:1

C#多线程学习(六) 互斥对象(2012-12-04 10:39:00)

摘要: 如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类。 我们可以把Mutex看作一个出租车,乘客看作线程。乘客首先等车,然后上车,最后下车。当一个乘客在车上时,其他乘客就只有等他下车以后才可以上车。而线程与Mutex对象的关系也正是如此,线程使用Mutex.WaitOne()方法等待Mutex对象被释放,如果它等待的Mutex对象被释放了,它就自动拥有这个对象,直到它调用Mutex.ReleaseMutex()方法释放这个对象,而在此期间,其他想要获取这个Mutex对象的线程都只有等待。 下面这个例子使用了Mutex对象来同步四个线程,主线程等待四个线程的结束,而这四个线程的运行又是与两个Mutex对象相关联的。 其中还用到AutoResetEvent类的对象,可以把它理解为一个信号灯。这里用它的有信号状态来表示一个线程的结束。 // AutoResetEvent.Set()方法设置它为有信号状态 // AutoResetEvent.Reset()方法设置它为无信号状态 Mutex 类的程序示例:
Code using System; using System.Threading; namespace ThreadExample { public class MutexSample { static Mutex gM1; static Mutex gM2; const int ITERS = 100; static AutoResetEvent Event1 = new AutoResetEvent(false); static AutoResetEvent Event2 = new AutoResetEvent(false); static AutoResetEvent Event3 = new AutoResetEvent(false); static AutoResetEvent Event4 = new AutoResetEvent(false); public static void Main(String[] args)    { ......

阅读全文(914) | 评论:1

C#多线程学习(五) 多线程的自动管理(定时器)(2012-12-04 10:38:00)

摘要: Timer类:设置一个定时器,定时执行用户指定的函数。 定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数。 初始化一个Timer对象: Timer timer = new Timer(timerDelegate, s,1000, 1000); // 第一个参数:指定了TimerCallback 委托,表示要执行的方法; // 第二个参数:一个包含回调方法要使用的信息的对象,或者为空引用; // 第三个参数:延迟时间——计时开始的时刻距现在的时间,单位是毫秒,指定为“0”表示立即启动计时器; // 第四个参数:定时器的时间间隔——计时开始以后,每隔这么长的一段时间,TimerCallback所代表的方法将被调用一次,单位也是毫秒。指定 Timeout.Infinite 可以禁用定期终止。 Timer.Change()方法:修改定时器的设置。(这是一个参数类型重载的方法) 使用示例:  timer.Change(1000,2000); Timer类的程序示例(来源:MSDN):
Code using System; using System.Threading; namespace ThreadExample { class TimerExampleState { public int counter = 0; public Timer tmr; } class App { public static void Main()    {    TimerExampleState s = new TimerExampleState(); //创建代理对象TimerCallback,该代理将被定时调用 TimerCallback timerDelegate = new TimerCallback(CheckStatus); //创建一个时间间隔为1s的定时器 Timer timer = new Timer(timerDelegate, s,1000, 1000); s.tmr = timer; //主线程停下来等待......

阅读全文(1196) | 评论:1

C#多线程学习(三) 生产者和消费者(2012-12-04 10:36:00)

摘要:   前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。 C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。在C#中,关键字lock定义如下: lock(expression) statement_block expression代表你希望跟踪的对象,通常是对象引用。 如果你想保护一个类的实例,一般地,你可以使用this; 如果你想保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了。 而statement_block就是互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。 下面是一个使用lock关键字的典型例子,在注释里说明了lock关键字的用法和用途。 示例如下:
Code using System; using System.Threading; namespace ThreadSimple { internal class Account { int balance; Random r = new Random(); internal Account(int initial) { balance = initial; } internal int Withdraw(int amount) { if (balance < 0) { //如果balance小于0则抛出异常 throw new Exception("Negative Balance"); } //下面的代码保证在当前线程修改balance的值完成之前 //不会有其他线程也执行这段代码来修改balance的值 //因此,balance的值是不可能小于0 的 lock (this) ......

阅读全文(1070) | 评论:1

C#多线程学习(二) 如何操纵一个线程(2012-12-04 10:34:00)

摘要: 下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可。(线程入口使程序知道该让这个线程干什么事) 在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程要执行的函数,当调用Thread.Start()方法后,线程就开始执行ThreadStart所代表或者说指向的函数。 打开你的VS.net,新建一个控制台应用程序(Console Application),编写完全控制一个线程的代码示例:
using System; using System.Threading; namespace ThreadTest { public class Alpha { public void Beta() { while (true) { Console.WriteLine("Alpha.Beta is running in its own thread."); } } }; public class Simple { public static int Main() {   Console.WriteLine("Thread Start/Stop/Join Sample"); Alpha oAlpha = new Alpha();    file://这里创建一个线程,使之执行Alpha类的Beta()方法 Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));    oThread.Start(); while (!oThread.IsAlive)    Thread.Sleep(1);    oThread.Abort();    oThread.Join();    Console.WriteLine();    C......

阅读全文(1256) | 评论:1

C#多线程学习(四) 多线程的自动管理(线程池)(2012-12-04 10:28:00)

摘要:   在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPool(线程池)来解决; 另一种情况:线程平时都处于休眠状态,只是周期性地被唤醒 这一般使用Timer(定时器)来解决; ThreadPool类提供一个由系统维护的线程池(可以看作一个线程的容器),该容器需要 Windows 2000 以上系统支持,因为其中某些方法调用了只有高版本的Windows才有的API函数。 将线程安放在线程池里,需使用ThreadPool.QueueUserWorkItem()方法,该方法的原型如下: //将一个线程放进线程池,该线程的Start()方法将调用WaitCallback代理对象代表的函数 public static bool QueueUserWorkItem(WaitCallback); //重载的方法如下,参数object将传递给WaitCallback所代表的方法 public static bool QueueUserWorkItem(WaitCallback, object); ThreadPool类是一个静态类,你不能也不必要生成它的对象。而且一旦使用该方法在线程池中添加了一个项目,那么该项目将是无法取消的。 在这里你无需自己建立线程,只需把你要做的工作写成函数,然后作为参数传递给ThreadPool.QueueUserWorkItem()方法就行了,传递的方法就是依靠WaitCallback代理对象,而线程的建立、管理、运行等工作都是由系统自动完成的,你无须考虑那些复杂的细节问题。 ThreadPool 的用法: 首先程序创建了一个ManualResetEvent对象,该对象就像一个信号灯,可以利用它的信号来通知其它线程。 本例中,当线程池中所有线程工作都完成以后,ManualResetEvent对象将被设置为有信号,从而通知主线程继续运行。 ManualResetEvent对象有几个重要的方法: 初始......

阅读全文(1204) | 评论:1

C#多线程学习(一) 多线程的相关概念(2012-12-04 10:17:00)

摘要: 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。 什么是线程? 线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。 什么是多线程? 多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。 多线程的好处: 可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。 多线程的不利方面: 线程也是程序,所以线程需要占用内存,线程越多占用内存也越多; 多线程需要协调和管理,所以需要CPU时间跟踪线程; 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;线程太多会导致控制太复杂,最终可能造成很多Bug; 接下来将对C#编程中的多线程机制进行探讨。为了省去创建GUI那些繁琐的步骤,更清晰地逼近线程的本质,接下来的所有程序都是控制台程序,程序最后的Console.ReadLine()是为了使程序中途停下来,以便看清楚执行过程中的输出。 任何程序在执行时,至少有一个主线程。 一个直观印象的线程示例:
using System; using System.Threading; namespace ThreadTest { class RunIt   {     [STAThread] staticvoid Main(string[] args)     {       Thread.CurrentThread.Name="System Thread";//给当前线程起名为"System Thread" Console.WriteLine(Thread.CurrentThread.Name+"'Status:"+Thread.CurrentThread.ThreadState);       Console.ReadLine();     }   } }......

阅读全文(1078) | 评论:1

谈谈委托(delegate)(2012-11-18 11:08:00)

摘要:   谈谈委托(delegate) 收藏
委托(delegate):
      在面向对象编程中,使用的都是对象,作为对象,它们都有很多共性,比如说,可以作为参数使用。
         /**////
///方法PayFee接收字符串作为参数
///
private void PayFee(string message)
{
   MessageBox.Show(message);
}方法PayFee(),接收的参数是字符串,我们也可以重载PayFee(),让它接收的参数为int,enum,class,struct或者其他类型,如果想接收的参数类型是个方法,是否可以呢?  可以的,既然是面向对象编程,方法也是可以作为参数使用的。只是,方法比较特殊,它自己可以接收其他参数,也可以返回值。  在一个可以接收参数、返回值的方法中,接收另一个同样可以有参数、返回值的方法作为参数,可以很容易的理解,但是执行起来,容易产生混淆。 为了避免可能会有的问题,引入的概念委托(delegate)。我们常用委托,比如请人代缴手机费,好像很简单啊,说一声,帮我代缴,回来给你钱。这样做,一般情况下,都会正常实现,或许因为你委托的人同你比较熟悉,可以信赖。但让我们分析一下,这其中可能遇到的问题: 1.委托人同意替你缴费,但是由于种种原因,忘记了替你缴费,或者忘记了当月缴费,导致了手机停机;
2.委托人不但没有替你缴费,还对你说已经缴费,并收了你的钱。 ......

阅读全文(1236) | 评论:1

.net面试问答(大汇总) (二)(2012-08-18 11:07:00)

摘要: 概述反射和序列化 反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对 象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后, 可以调用类型的方法或访问其字段和属性 序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通 过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。 11)  XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限? 我只知道XmlSerializer是将对象的属性和字段进行序列化和反序列化的,序列化成为xml数据,反序列化再将xml 转换成对象。应该至少需要ACL权限中的读权限. 23)XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题? 只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能。
26.根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:
namespace test
{
public delegate void OnDBOperate();
public class UserControlBase : System.Windows.Forms.UserControl
{
public event OnDBOperate OnNew;
privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if(e.Button.Equals(BtnNew))
{
//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。
}
}
......

阅读全文(14465) | 评论:14

.net面试问答(大汇总) (一)(2012-08-18 11:06:00)

摘要: 用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
答: 从下至上分别为:数据访问层、业务逻辑层(又或成为领域层)、表示层     
数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问      
业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关      
表示层:是系统的UI部分,负责使用者与整个系统的交互。
优点:  分工明确,条理清晰,易于调试,而且具有可扩展性。      
缺点:  增加成本。 分层式结构究竟其优势何在?
1、开发人员可以只关注整个结构中的其中某一层;     
2、可以很容易的用新的实现来替换原有层次的实现;      
3、可以降低层与层之间的依赖;      
4、有利于标准化;      
5、利于各层逻辑的复用。      
概括来说,分层式设计可以达至如下目的:分散关注、松散耦合、逻辑复用、标准定义。 分层式结构也不可避免具有一些缺陷:
1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。     
2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑......

阅读全文(14112) | 评论:11