zoukankan      html  css  js  c++  java
  • C#线程调用带参数的方法

    在多线程或单线程任务中,让线程带传入参数一直是个麻烦的问题,通常有种方法就是以类,对像的变量来传参数,这种方法理解上很简单不过在某些场合使用很麻烦,这里就不介绍了,我们主要介绍一种.NET2.0中新增加的带参数运行线程的方法,示例程序如下:

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

    ThreadMethod如下:
    public void ThreadMethod(object ParObject)
    {
        //程序代码
    }

    如果是多参数的话可以以数组或动态列表等方式装相入 object,然后使用时拆箱即可

    这样是不是简单多了哈,,,
    -----------------------------------------------------------------------------------

    -----------------------------------------------------------------------------------

    [转]个人认为,还是为线程创建一个单独的类,在类的初始化函数里头为类里头的变量赋值,来达到传入参数比较简单。下面有些方法是有问题的,不过我已经达到了目的就懒得去排错了,哪位朋友看出问题了提醒一下啊。呵呵...

    方法一:
    在VS2003中,也不能直接访问,参看  
    一般来说,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能 简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作。  

    现在用一个用线程控制的进程条来说明,大致的步骤如下:  

    1.创建Invoke函数,大致如下:  
    /// <summary>  
    /// Delegate function be invoked by main thread  
    /// </summary>  
    private     void     InvokeFun()  
    {  
        if(prgBar.Value< 100)  
        prgBar.Value = prgBar.Value + 1;  
    }  

    2.子线程入口函数:  
    /// <summary>  
    /// Thread function interface  
    /// </summary>  
    private void ThreadFun()  
    {  
        // Create invoke method by specific function
        MethodInvoker mi = new MethodInvoker(this.InvokeFun);  

        for(int i=0; i<100; i++)  
        {  
          this.BeginInvoke(mi);    
          Thread.Sleep(100);  
        }  
    }

    3.创建子线程:  
    Thread thdProcess = new Thread(new ThreadStart(ThreadFun));  
    thdProcess.Start();  

    备注:  
        using System.Threading;  
        private System.Windows.Forms.ProgressBar prgBar;  

    方法二:
    加入该句:Control.CheckForIllegalCrossThreadCalls = False    取消线线程安全保护模式!

    方法三:带参数
    使用类、类的方法或类的属性都可以向线程传递参数:
    public class UrlDownloader
    {
        string url;
      
        public UrlDownloader (string url)
        {
          this.url = url;
        }
      
        public void Download()
        {
          WebClient wc = new WebClient();
          Console.WriteLine("Downloading " + url);                        
          byte[] buffer = wc.DownloadData (url);
          string download = Encoding.ASCII.GetString(buffer);
          Console.WriteLine(download);
          Console.WriteLine("Download successful.");
        
          //这里你可以将download进行保存等处理......
        }
    }

    [... 在另一个类中使用它们...]
                  
    UrlDownloader downloader = new UrlDownloader (yourUrl);
    new Thread (new ThreadStart (downloader.Download)).Start();

    注意参数是如何传递的。

    方法四:带参数
    ThreadStart starter = delegate { Download(yourUrl); };
    new Thread(starter).Start();

    //使用线程池
    WaitCallback callback = delegate (object state) { Download ((string)state); };
    ThreadPool.QueueUserWorkItem (callback, yourUrl);

    方法五:带参数
    Thread t = new Thread (new ParameterizedThreadStart(DownloadUrl));
    t.Start (myUrl);
    static void DownloadUrl(object url)
    {
      // ....
    }

    ----------------------------------------------------------------------------

    ----------------------------------------------------------------------------

    C#线程调用带参数的方法

    之前做了一个小的应用程序,用的是c#语言,在做的过程中遇到了一个困难,就是不如调用带参数的线程,经过查找网上的资料,找到了简单的解决方案。
    在以前的学习中,我们经常碰到的是没有带参数的线程,所以当遇到必须用到参数的线程时就会手足无措,现在我们用的这种解决问题的方法,实际上的原理是:将线程执行的方法和参数都封装到一个类里面。通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递参数。看如下代码:
     

    using System;
    using System.Threading;

    //ThreadWithState 类里包含了将要执行的任务以及执行任务的方法
    public class ThreadWithState {
         //要用到的属性,也就是我们要传递的参数
         private string boilerplate;
         private int value;

    //包含参数的构造函数
         public ThreadWithState(string text, int number)
         {
             boilerplate = text;
             value = number;
         }

        //要丢给线程执行的方法,本处无返回类型就是为了能让ThreadStart来调用
         public void ThreadProc()
         {
             //这里就是要执行的任务,本处只显示一下传入的参数
              Console.WriteLine(boilerplate, value);
         }
    }


    ---------------分隔线---------------
    //用来调用上面方法的类,是本例执行的入口
    public class Example {
         public static void Main()
         {
            //实例化ThreadWithState类,为线程提供参数
             ThreadWithState tws = new ThreadWithState(
                 "This report displays the number {0}.", 42);

           // 创建执行任务的线程,并执行
             Thread t = new Thread(new ThreadStart(tws.ThreadProc));
             t.Start();
             Console.WriteLine("Main thread does some work, then waits.");
             t.Join();
             Console.WriteLine(
                 "Independent task has completed; main thread ends.");  
         }
    }

     从上面的例子就能很清楚的得到我们想要的结果,注意这句代码的用法:
    Thread t = new Thread(new ThreadStart(tws.ThreadProc));
    ---摘自网络
  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/linjiancun/p/1808601.html
Copyright © 2011-2022 走看看