动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > ASP.NET技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ ASP.NET技巧 ]的信息

本月文章推荐
.在ASP.NET中从SQL Server检索图片.
.关于HtmlForm控件.
.用MasterPage 代替 PageBase.
.认识ASP.NET配置文件Web.config.
.ACCESS在Web.config里设置连接字.
.下载文件出现提示框或者直接显示.
.asp.net(C#)海量数据表高效率分页.
.ASP.NET保持用户状态的九种选择(.
.DataGridView 的分页处理.
.数据岛出到Excel最为简易的方法.
.asp.net错误处理封装.
.lucene并行建索引解决方案.
.开发ASP.NET下的MP3小偷程序.
.Access 通用数据访问类(asp.net .
.asp.net 2.0下一个标准GRIDVIEW功.
.Asp.net(C#)多文件上传.
.在 ASP.NET 中用匿名委托简单模拟.
.对asp.net1.1开发模板类的一些修.
.应用lucene.net进行搜索测试.
.利用模版生成html页.

如何在调用线程的时候传递参数

发表日期:2006-1-17 |


我们在写Remoting程序或者其他的一些应用程序的时候难免要和线程打交道,.Net使我们很容易就可以创建一个线程,但是它提供的创建线程和启动线程的方法没有明显的提供参数,假如我们要用线程来启动类里面一个带参数的方法该怎么办?下面就简单的介绍如何使用.NET提供的丰富的框架来实现这个功能。为了可以生动详细的介绍整个过程,我建立下面的一个.NET类,它也是要用线程启动的方法的载体。类如下所示:

using System;

 

namespace WindowsApplication1

{

       /// <summary>

       /// Summary description for UrlFetcher.

       /// </summary>

       public class MyClass{

             

              // for method 1

              private string _parameter;

              public MyClass(string parameter){

                     this._parameter = parameter;

              }

              public void MyMethod1(){

                     if(this._parameter!=null){

                            // do something

                            Console.Write(this._parameter);

                     }

              }

 

              // for method 2

              public MyClass(){}

              // this method is private,But it can be public or other

              private void MyMethod2(string parameter){

                     // do something

                     Console.Write(parameter);

              }

              // Because delegate WaitCallback's parameter Type is object

              // I will convert it to string.

              public void MyMethod2(object parameter){

                     this.MyMethod2((string)parameter);

              }

 

              // for method 3

              public string MyMethod3(string parameter){

                     return "参数值为:"+parameter;

              }

 

              // for mutil-parameters passed

              public string MyMutilParameters(string param1,string param2){

                     return "参数1和参数2连接结果为:"+param1+param2;

              }

             

       }

}

 

嘿嘿,我的英语不行,注释写的不好请见谅(因为使用的是英文的),希望没有影响您的阅读。我想我有必要简单的说一下上面这个类里里面的所包含的内容。首先包含两个构造函数,一个带参数一个不带(这里可是有意安排的)。通过类中其他方法的名字我想您一定猜出来我将介绍3种方法来传递参数,接下来我将逐一介绍。首先我们看看如何启动一个线程,首先我们可以用一个函数来实例化ThreadStart委托的一个实例,然后在使用这个实例作为参数new线程(Thread)对象,最后将这个线程Start就可以了,想了解更多请参考MSDN文档的Thread部分。

为了测试我们的结果我建立了一个WinForm的工程,其中有一个Form和4个按钮,如果你需要所有的源码请发送邮件到wu_jian830@hotmail.com,如果我有时间我会给你发过去的。接下来是每种方法的详细描述。

1、使用构造函数来传递参数

众所周知,我们可以使用一个带参数的构造函数来构造对象,既然这样我们可以利用构造函数先将要使用的参数值传递到对象里面的内部变量上,然后再使用一个无参数的方法来使用这个参数(假装参数)。简单的说就是,在类里面声明一个变量专门用来保存函数需要的参数,函数变成无参的形式。这种方法的最大问题就是破坏了封装性,虽然我们不能直接方法这些变量但是隐患总是存在的(或者说看上去不爽都可以)。下面代码片断给出了如何使用这个方法来传递参数的详细内容,这也是上面提到的4个按钮中的一个按钮(Button1)的Click代码。为了有参数可传我在WinForm全局定义了一个如下的变量:

// This is parameter's value

       private string myParameter = "ParameterValue\n";

按钮事件如下所示:

// passed parameters to thread by construct

       private void button1_Click(object sender, System.EventArgs e) {

              MyClass instance = new MyClass(myParameter);

              new Thread (new ThreadStart(instance.MyMethod1)).Start();

       }

正如上面所说的,我们使用构造函数传递参数到类里面去,然后在使用上面所说的方法启动了一个线程,我们可以在运行该程序后的output窗口中看到MyMethod1的执行结果是(你也可以用一个TextBox或者其他什么东西直接显示在WinForm上):ParameterValue  。看看函数体就知道这个结果是正确的。是不是很简单。

2、使用ThreadPool来实现参数的传递

我们首先可以看看MSDN对ThreadPool是怎么形容的,Provides a pool of threads that can be used to post work items, process asynchronous I/O, wait on behalf of other threads, and process timers.查看它的方法集合其中有一个叫:QueueUserWorkItem 的方法,该类以及该方法的详细信息请参考MSDN相关帮助。这里需要注意的就是QueueUserWorkItem方法的参数,参数WaitCallback是一个委托类型,第二个参数就是该委托实例(用函数实例化以后,也就是一个函数)所需要的参数,是object类型的。详细内容请看下面的代码。

// passed parameter to thread by ThreadPool

private void button2_Click(object sender, System.EventArgs e) {

MyClass instance = new MyClass();

     ThreadPool.QueueUserWorkItem (new WaitCallback (instance.MyMethod2),myParameter);

}

       因为QueueUserWorkItem的二个参数是object类型的所以我们要在MyClass里面定义两个MyMethod2的重裁版本,目的就是为了满足该方法的参数。同样我们将参数myParameter传递进去了,运行程序,当我们点击Button2的时候在output窗口中将会出现MyMethod2将myParameter作为参数执行的结果显示出来。

       3、接下来是最后一种方法使用异步委托来实现参数的传递

       同样,有关委托的详细信息可以参考MSDN,上面说的非常详细。我们这里要使用到BeginInvoke和EndInvoke方法。首先我们给出传递一个参数的方法如下所示:

// passed parameter by asynchronous delegate

delegate string MyMethod3Delegate(string parameter);

       private void button3_Click(object sender, System.EventArgs e) {

              MyClass instance = new MyClass();

              MyMethod3Delegate myMethod3 = new MyMethod3Delegate(instance.MyMethod3);

              myMethod3.BeginInvoke("parameterValue",new AsyncCallback(AfterMyMothod3),null);

       }

       public void AfterMyMothod3(IAsyncResult result){

              AsyncResult async = (AsyncResult) result;

              MyMethod3Delegate DelegateInstance = (MyMethod3Delegate) async.AsyncDelegate;

              Console.WriteLine ("函数调用返回值:{0}\n", DelegateInstance.EndInvoke(result));

       }    

       首先为了使用委托我们声明了一个MyMethod3Delegate的委托,该委托说明一个参数和返回值为string的函数是符合条件的,所以我们在MyClass里面定义了一个MyMethod3的方法。该函数的型构符合上面的委托,所以我们可以在Button3点击的时候用这个方法实例化一个委托,然后我们使用异步的方式调用这个方法,为了得到返回结果我们写了AfterMyMothod3方法用来显示该函数的执行结果。运行程序点击Button3可以看到Output中输出的结果为MyMethod3带参数执行的结果。最后我给出如何传递多个参数的方法,我的例子是传递2个参数。代码如下:

// mutil-parameters passed

       delegate string MyMutilParamsDelegate(string parameter1,string parameter2);

       private void button4_Click(object sender, System.EventArgs e) {

              MyClass instance = new MyClass();

              MyMutilParamsDelegate mutilParams = new MyMutilParamsDelegate(instance.MyMutilParameters);

              mutilParams.BeginInvoke("param1","params2",new AsyncCallback(AfterMutilParams),null);

       }

 

       public void AfterMutilParams(IAsyncResult result){

              AsyncResult async = (AsyncResult) result;

              MyMutilParamsDelegate DelegateInstance = (MyMutilParamsDelegate) async.AsyncDelegate;

              Console.WriteLine ("多参数函数调用返回结果:{0}\n", DelegateInstance.EndInvoke(result));

       }

由于篇幅关系代码就不作详细说明了。有不正确的地方请指正,谢谢阅读!联系方式:wu_jian830@hotmail.com  CSDN论坛ID:cuike519

参考文档:

http://www.codeproject.com/Purgatory/ThreadsinC_.asp

http://www.msdn.com

上一篇:为Serv-U提供在线修改密码功能 人气:7484
下一篇:.NET 连接到 Oracle的oci.dll加载错误解决方案 人气:8101
浏览全部asp.net的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-7 Pcook cms 文章管理系统 (老Y CM
2008-9-7 仿代码小说小偷系统 v1.0
2008-9-7 百度一搜集成搜索管理系统
2008-9-7 小贤统计器 v1.0
2008-9-6 Movie34电影搜索引擎 v3.0
2008-9-6 wap2.0仿帝国建站喜用 v2.0
2008-9-6 免费人才招聘网 宽屏版 v3.01
2008-9-6 喜喔喔视频采集程序 v1.0 beta
2008-9-6 ASP客户管理系统
2008-9-7 iBlacklist通话黑名单汉化破解补
2008-9-7 EndlessWalls无尽壁纸 v1.0.4破解
2008-9-7 Dynolicious车载测量仪v1.1破解版
2008-9-7 iVoodoo巫毒娃娃1.0.1破解版
2008-9-7 iWallpape精品墙纸1.2破解版
2008-9-7 iChillout自然音效工具1.1破解版
2008-9-7 Todo计划提醒1.2破解版
2008-9-7 allRadio电台集合1.01破解版
2008-9-7 My Money个人理财1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵