.Net中使用带参数的线程

 

ThreadStart可不支持带参数的方法.所以你无法使用Thread来启动一个带参数的方法..

            ThreadStart myThreadDelegate  =   new  ThreadStart(ThreadMethod);
            
// public delegate void ThreadStart();  u can't pass a Parameter
            Thread myThread  =   new  Thread(myThreadDelegate);
            myThread.Start();  
// myThread.Start(o); Wrong! 


不过在.Net1.0下,你可以通过Delegate的异步调用来实现.现在在.Net2.0下提供了ParameterizedThreadStart 这么一个Delegate.它和ThreadStart 的不同就在于可以拥有一个object类型的参数.也就是说你可以通过它来使用Thread类以启动一个线程并传入参数, 和Java很象了,不错的新功能.

using  System;
using  System.Threading;
namespace  ParameterizedThreadStartTest
{
    
class Program
    
{
        
static void Main(string[] args)
        
{

            ParameterizedThreadStart myParameterizedThreadDelegate 
= new ParameterizedThreadStart(ThreadMethod);
            Thread myThread 
= new Thread(myParameterizedThreadDelegate);
            
object o = "hello";
            myThread.Start(o);

        }


        
private static void ThreadMethod(object o)
        
{
            
string str = o as string;
            Console.WriteLine(str);
        }

    }

}



还有一个新增的类BackgroundWorker,可以用于启动后台线程,并在后台计算结束后及时调用主线程的方法.
一个常见的应用就是在DataGrid中载入数据的时候.因为从数据库中载入DataSet比较耗时, 所以你可以使用
BackgroundWorker来进行载入, 当DataSet构造好后就立即绑定上DataGrid. 其实该功能同样可以通过Delegate的异步调用实现不过BackgroundWorker用起来更方便一些.
// 1. Instantiate a BackgroundWorker instance:
BackgroundWorker myDataWorker  =   new  BackgroundWorker(); 

// 2. Setup a DoWork delegate that does the work that you want to be done on the background thread.  

myDataWorker.DoWork 
+=   new  DoWorkEventHandler( delegate ( object  o, DoWorkEventArgs workerEventArgs) 
                                                
{
                                                    workerEventArgs.Result 
= new XXXDAL().GetData();
                                                }

                                                );

// 3. Setup a RunWorkerCompleted delegate that handles updating your UI with the data recieved on the background thread.
myDataWorker.RunWorkerCompleted  +=   new  RunWorkerCompletedEventHandler( delegate ( object  o, RunWorkerCompletedEventArgs workerEventArgs) 
                                                        
{
                                                            DataSet data 
= (DataSet) workerEventArgs.Result;
                                                            
this.dataGrid.DataSource = data;
                                                        }

                                                        );

// 4.Run your worker by calling the RunWorkerAsync() method on your BackgroundWorker instance.
myDataWorker.RunWorkerAsync();
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在.NET Framework 1.1,可以使用Thread类来执行多线程操作,可以通过将方法和参数传递给ThreadStart委托,然后创建一个新的Thread对象并启动线程来实现多线程执行参数的方法。示例如下: ```csharp public class MyThreadClass { private string _arg1; private int _arg2; public MyThreadClass(string arg1, int arg2) { _arg1 = arg1; _arg2 = arg2; } public void MyMethod() { //执行需要在多线程执行的操作 } } //创建一个新的ThreadStart委托并传递方法和参数 ThreadStart threadStart = delegate { new MyThreadClass("参数1", 2).MyMethod(); }; //创建一个新的Thread对象并启动线程 Thread thread = new Thread(threadStart); thread.Start(); ``` ### 回答2: 在.NET Framework 1.1,要实现多线程执行参数的方法,可以使用Thread类来创建和管理线程。下面是一种方法: 1. 创建自定义的线程入口方法,它接受参数并执行相应的方法。例如,可以创建一个名为"ExecuteMethod"的方法,它接受一个对象参数,然后根据需要调用相应的方法。 2. 在主线程创建一个Thread对象,并将自定义的线程入口方法传递给它。例如,可以使用以下代码来创建线程Thread thread = new Thread(ExecuteMethod); 3. 在创建线程之前,可以设置线程的属性,如IsBackground,Priority等。例如,可以使用thread.IsBackground = true设置线程为后台线程。 4. 调用Thread.Start()方法开始线程的执行。这会创建一个新的线程,并调用线程入口方法。 5. 在线程入口方法,根据需要将参数传递给方法,并执行该方法。例如,可以使用以下代码在线程入口方法调用方法: public void ExecuteMethod(object parameter) { // 将参数转换为适当的类型,并调用相应的方法 int value = (int)parameter; SomeMethod(value); } 6. 在需要执行参数方法的地方,可以使用以下代码启动线程并传递参数: int param = 10; thread.Start(param); 这样,就可以在.NET Framework 1.1实现多线程执行参数的方法。通过使用Thread类创建线程,并在线程入口方法接受参数并执行相应的方法,可以实现对参数方法的多线程执行。 ### 回答3: 在.NET Framework 1.1,可以通过使用Thread类实现多线程执行参数的方法。 首先,需要在程序创建一个新的Thread实例,然后将需要执行的方法作为参数传递给Thread实例的Start方法,以便在新线程执行该方法。例如: ``` Thread myThread = new Thread(new ParameterizedThreadStart(MyMethod)); myThread.Start(myParameter); ``` 在上述代码,MyMethod是参数的方法的名称,myParameter是需要传递给方法的参数。要确保MyMethod的定义与ParameterizedThreadStart委托的签名匹配,即接受一个object类型的参数。 然后,需要在MyMethod方法处理传递的参数。可以使用强制类型转换将传递的object参数转换为适当的类型。例如: ``` void MyMethod(object parameter) { int myParameter = (int)parameter; // 执行参数的方法的代码 } ``` 在上述代码,将参数parameter强制转换为int类型,并将其赋值给myParameter变量。然后,在MyMethod方法可以使用myParameter变量执行参数的代码。 需要注意的是,多线程编程可能涉及到线程同步和竞争条件等问题。在使用线程时,应确保正确处理共享资源,以避免可能的线程安全性问题。 另外,需要注意的是,.NET Framework 1.1是相对较旧的版本,已经有更高版本的.NET Framework可用。如果您有选择的余地,建议考虑升级到较新的.NET Framework版本以获得更好的性能和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值