c#

位置:IT落伍者 >> c# >> 浏览文章

Visual C#多线程参数传递浅析(2)


发布日期:2023年10月21日
 
Visual C#多线程参数传递浅析
使用构造函数来传递参数

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

// This is parameters value

private string myParameter = ParameterValue\n;

按钮事件如下所示

// passed parameters to thread by construct

private void button_Click(object sender SystemEventArgs e) {

MyClass instance = new MyClass(myParameter);

new Thread (new ThreadStart(instanceMyMethod))Start();

}

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

使用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 button_Click(object sender SystemEventArgs e) {

MyClass instance = new MyClass();

ThreadPoolQueueUserWorkItem (new WaitCallback (instanceMyMethod)myParameter);

}

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

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

上一篇:C#使用委托调用实现用户端等待闪屏

下一篇:C#中将Big5繁体转换简体GB2312的程序