博文
c#.net多线程编程教学(2):Thread类(2006-05-22 09:43:00)
摘要:这章将向大家介绍.NET中的线程API,怎么样用C#创建线程,启动和停止线程,设置优先级和状态.
在.NET中编写的程序将被自动的分配一个线程.让我们来看看用C#编程语言创建线程并且继续学习线程的知识。我们都知道.NET的运行时环境的主线程由Main ()方法来启动应用程序,而且.NET的编译语言有自动的垃圾收集功能,这个垃圾收集发生在另外一个线程里面,所有的这些都是后台发生的,让我们无法感觉到发生了什么事情.在这里默认的是只有一个线程来完成所有的程序任务,但是正如我们在第一篇文章讨论过的一样,有可能我们根据需要自己添加更多的线程让程序更好的协调工作。比如说我们的例子中,一个有用户输入的同时需要绘制图形或者完成大量的运算的程序,我们必须得增加一个线程,让用户的输入能够得到及时的响应,因为输入对时间和响应的要求是紧迫的,而另外一个线程负责图形绘制或者大量的运算。
.NET 基础类库的System.Threading命名空间提供了大量的类和接口支持多线程。这个命名空间有很多的类,我们将在这里着重讨论Thread这个类。
System.Threading.Thread类是创建并控制线程,设置其优先级并获取其状态最为常用的类。他有很多的方法,在这里我们将就比较常用和重要的方法做一下介绍:
Thread.Start():启动线程的执行;
Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用;
Thread.Resume():继续已挂起的线程;
Thread.Interrupt():中止处于 Wait或者Sleep或者Join 线程状态的线程;
Thread.Join():阻塞调用线程,直到某个线程终止时为止
Thread.Sleep():将当前线程阻塞指定的毫秒数;
Thread.Abort():以开始终止此线程的过程。如果线程已经在终止,则不能通过Thread.Start()来启动线程。
通过调用Thread.Sleep,Thread.Suspend或者Thread.Join可以暂停/阻塞线程。调用Sleep()和Suspend()方法意味着线程将不再得到C......
C#多线程应用技术面对面探讨(2006-05-22 09:22:00)
摘要:实例程序说明
本文的实例程序包括一个列表框、三个按钮。程序使用一个新的线程来运行一个后台处理,结果在列表框中显示。按钮button1启动一个计算平方的线程。按钮button2停止后台处理线程。按钮button3退出程序。程序运行情况如图1所示。
使用线程
首先创建运行在新线程上的后台任务。表1所示的代码执行一个相当长的运行处理----一个无限循环。
表1、后台处理程序
private void BackgroundProcess()
{
int i= 1;
while(true)
{
// 向列表框增加一个项目
listBox1.Items.Add("Iterations: " + i.ToString ());
i ++;
Thread.Sleep(2000); // 指定线程休眠的时间
}
}
这段代码无限循环,每次执行时在列表框中加入一个项目。
在规定好一个工作的处理代码以后,就需要将这段代码分配给一个线程,并且启动它。为此需要使用线程对象(Thread object),它是.NET架构类中System.Threading命名空间的一部分。在实例化一个新的线程类时,需要把在线程类构造器中执行的代码块的一个引用传送给该实例。表2所示的代码创建一个新的线程对象,并且将BackgroundProcess的一个引用传送给该对象。
表2、线程的使用
Thread t1,t2; // 说明为窗体类成员
t1 = new Thread(new ThreadStart(BackgroundProcess));
t1.Start(); // 以上2行放置在窗体的load事件中
ThreadStart表示在线程上执行的方法,这里是一个到BackgroundProcess方法的委派对象。在C#中,一个委派是一个类型安全、面向对象的函数指针。在实例化该线程后,可以通过调用线程的Start()方法来开始执行代码。
控制线程
在线程启动以后,可以通过调用线程对象的方法来......
如何将论坛附件直接以文件形式保存,并读取照片文件的Exif信息(2006-05-19 11:42:00)
摘要:废话少说,直接进入主题:
准备工作:下载PhotoProperties类库(http://www.codeproject.com/cs/media/photoproperties.asp),用于读取Exif信息,在Components中引用该类库
1、修改web.config配置文件,在forums/forums下增加一个配置项
uploadFilesPath="/Upload/"
值可以自行修改,用来保存用户上传的文件;
2、修改数据库
forums_PostAttachments表增加如下字段
DiskFileName nvarchar(256), 保存附件在硬盘上的文件名
Exif nvarchar(200), 用于保存照片附件的Exif信息
CheckGuid nvarchar(50) 用于保存检测的Guid
注意:我们修改的最终方案是会删除原有的Content字段的
修改存储过程:create procedure forums_PostAttachment_Add
(
@PostID int,
@UserID int,
@ForumID int,
 ......
利用WSE 加密SOAP报文(2006-05-18 17:41:00)
摘要:给收到的报文解密
当收到一个由X.509证书加密后的报文后,SoapInputFilter会自动尝试使用用户密钥储存室的私有密钥来进行解密,当然,这个需要告诉WSE运行时哪里可以找到这个证书的额外配置信息。这个信息由应用程序配置文件的Security元素所指定,这个例子在客户端上的应用程序配置文件是App.config。对于 X.509加密,你只需要添加一个x509子节点,内容和下面一样就可以了
<x509
storeLocation="CurrentUser"
verifyTrust="true"
allowTestRoot="false" />
在我的例子中,我将x509节点的storeLocation属性设为CurrentUser,假设证书在当前用户的证书储存室里,当我使用了来自CA的受信任证书之后,我也将verifyTrust设为true了。这些属性还能够用WSE的设置工具来修改。利用这些信息,WSE能够得到报文中证书的私有密钥,还能用这个来给对称性会话密钥解密,解密后的内容到头来还要给报文正文解密。
选择用于解密的报文元素
当整个消息正文由默认设置给加密后,WSE能被用来给SOAP报文内的特定元素加密;唯一的问题是,在Security头元素那的元素不能被加密。你还可以加密嵌套的元素,
在这个例子服务中,我修改了GetXmlDocument方法用的X.509版本,用一个基于X.509的安全Token来同时给EncryptedSubResponse和它的EncryptedResponse父节点进行数字化加密,返回的XML文档如下:
<Response>
<NotEncrypted>
回应报文的这里没有必要被加密
</NotEncrypted>
<EncryptedResponse>
<EncryptedSubResponse>
这里是敏感数据.
</EncryptedSubResponse>
&......
ASP.NET中动态修改web.config中的设置项目(CS页代码) (2006-05-18 17:41:00)
摘要:
1 using System;
2 using System.Collections;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Web;
7 using System.Web.SessionState;
8 using System.Web.UI;
9 using System.Web.UI.WebControls;
10 using System.Web.UI.HtmlControls;
11 using System.Xml ;
12
13
14 namespace WebApplication1
15 {
16 /// <summary>
17 /// Summary description for WebForm1.
18 /// </summary>
19 public class WebForm1 : System.Web.UI.Page
20 {
21 protected System.Web.UI.WebControls.TextBox TextBo......
这几天一直在研究Enterprise Library的Configuration(2006-05-18 17:38:00)
摘要:首先 ConfigurationManager类实际上是对一些基本的操作配置数据方法的集合。这个类没有什么具体的用途。
最重要的类是ConfigurationBuilder类,它是建立配置最初的类。
还有就是ConfigurationFile类,它的用途是解析Xml格式的配置文件,还有就是对Xml文件内的节点进行添加、删除、更新的操作。
这个类微软把它写的太复杂了,具体的配置数据和元数据都由它解析。真复杂。
下面说一下当使用
ConfigurationManager.GetConfiguration("配置名称")
的时候,配置系统的操作流程。
首先,他使用ConfigurationManager.Current 内部属性来检查是否已经新建了ConfigurationBuilder类,如果已经建立则调用已经建立的ConfigurationBuilder类。很明显,这是一个典型的单件模式。
然后它调用ConfigurationBuilder类中的ReadConfiguration()方法,参数就是我们输入的那个配置名称。
当建立一个新的ConfigurationBuilder类实例的时候,它通过
System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
属性获取应用程序主配置文件(WinForm是App.config,WebForm是web.config)的完整路径,然后新建一个ConfigurationFile的实例,通过它解析配置文件中“enterpriselibrary.configurationSettings”节点的内容,把所有内容生成一个ConfigurationSettings类的实例,这个实例包含了一个ConfigurationSectionDataCollection集合类实例,他的内容是ConfigurationSectionData。
这个ConfigurationSectionData类和ConfigurationSectionDataCollection类实例就是保存在应用程序配置文件中enterpriselibrary.configu......
为ASP.NET封装的SQL数据库访问类(2006-05-18 17:33:00)
摘要:using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
namespace MyCorporation.DepartMent.DataBase
{
/// <summary>
/// 通用数据库类
/// </summary>
public class DataBase
{
private string ConnStr = null;
public DataBase()
{
ConnStr = ConfigurationSettings.AppSettings["ConnStr"];
}
public DataBase(string Str)
{
try
{
this.ConnStr = Str;
}
catch(Exception ex)
{
throw ex;
}
}
/// <summary>
/// 返回connection对象
/// </summary>
/// <returns></returns>
public SqlConnection ReturnConn()
{
SqlConnection Conn = new SqlConnection(ConnStr);
Conn.Open();
return Conn;
}
public void Dispose(SqlConnection Conn)
{
if(Conn!=null)
{
Conn.Close();
Conn.Dispose();
}
GC.Collect();
}
/// <summary>
/// 运行SQL语句......
正则表达式的原理和介绍,应用(概念篇)(2006-05-18 17:32:00)
摘要:极小元的概念
定义:对于任何的集合S1与S2,当S1∈S2且S1∩S2=空(没有空这个符号,我用中文字空代替)时,则称S1为S2的一极小元。
OK说完了定义,我们来说说关于正则匹配的东东,可以把要寻找的那个字符串看成一个集合S1,而要寻找的是一个极小元,也就是一个子集
而离散的正则定理:每个不空的集合,都有一极小元,明确的说出了,正则匹配的道理,我们要去寻找的是一个子集,也就是把大的字符串进行了分割,而其元素为一个个小的字符串子集
正则公理的数学表达式:A≠空 推出 (存在x)(x∈A∧x∩A=空)
现在是编译原理篇,编译原理是根据离散的内容而来的
首先是要说正规文法和有限自动机
正规文法(Chomsky 3型文法)
正规式(Regular Expression):
定义:设A是非空的有限字母表,则:
1)任意,空,全集都是正规式
2)若α,β是正则,则α|β,α·β,α*,β*也是正则(关于这个是涉及到文法的问题了,也就是大家常用的w+之类的东东了)
3)正则只能通过有限次使用1,2规则而获得
写点儿正规式大家都熟悉的α=a+b+c+所代表的正规集为L(α),它可以写作
L(α)={abc,aabc,abc,abcc,aaabc…}看到这里大家如果用过正则的话,可以很明白的看出来联系了
关于正规集的一些数学方面的东东我就不多说了,比如交换率,结合率之类的
而关于多个一个一长串的比如用或语句进行的东西还需要进行方程组的运算,不过说了
其实这里还有一个概念就是当你用while之类的语句的时候其实就是底层在用正则公式,而js或vbs用正则之所以慢是因为多重的正则寻找,就是正则下的正则,可以看看木狐狸的一个寻找的最优公式的贴子,在多重寻找之后速度自然就慢了
现在用VBS写一下,简单的事例
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>新建网页 3</title>
</head>
<script langua......
我对C#中事件委托的通俗看法 (2006-05-18 17:30:00)
摘要:这是我对C#中事件的通俗看法,比较适合初学者(其实我也是初学者)对C#事件的理解,本人因为刚入门,在学习C#的事件原理时,发现很多书上写得很不好理解,不适合初学者,所以我想在这里谈谈我对它的看法,可能不是很准确,如果说得对的,请大家鼓鼓掌,不对的或是不规范的地方,还请高手帮忙更正一下,谢谢了。
在学C#之前,我看过《JAVA编程思想》,还有一些JAVA的入门级的书籍,其中对事件的讲解,总是用事件监听,事件适配器来举例,
所以我就一直认为,在C#中,RUNTIMING会一直监测每个控件的状态,如果有控件的状态发生改变和话,就会触发事件。
后来仔细看了一些例题之后,发现这个想法真的是很傻的。
其实,理解C#的事件原理,必须明白以下一点:
控件属性的改变,在它的类中,是由set来改变的,可以理解为由方法(method)来改变的,而不是简单的赋值。
举个例子来说明:
class shape
{
private int cvalue;
public shape()
{cvalue = 0;}
public int colorvalue
{
set{cvalue = value;}
get{return cvalue;}
xml的四种解析器原理及性能比较 (2006-05-18 17:30:00)
摘要:1: DOM
DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。
另一方面,对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 SAX。
2:SAX
这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。
3: 选择 DOM 还是选择 SAX ?
对于需要自己编写代码来处理 XML 文档的开发人员来说,选择 DOM 还是 SAX 解析模型是一个非常重要的设计决策。
DOM 采用建立树形结构的方式访问 XML 文档,而 SAX 采用的事件模型。
DOM 解析器把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。用 DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档,所以对性能和内存的要求比较高,尤其是遇到很大的 XML 文件的时候。由于它的遍历能力,DOM 解析器常用于 XML 文档需要频繁的改变的服务中。
SAX 解析器采用了基于事件的模型,它在解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自......