精华内容
下载资源
问答
  • 在 .NET Framework 2.0 版中,要实现线程调用带参数的方法有两种办法。 第一种:使用ParameterizedThreadStart。 调用 System.Threading.Thread.Start(System.Object) 重载方法时将包含数据的对象传递给线程。 使用 ...

    在 .NET Framework 2.0 版中,要实现线程调用带参数的方法有两种办法。

    第一种:使用ParameterizedThreadStart。

    调用 System.Threading.Thread.Start(System.Object) 重载方法时将包含数据的对象传递给线程。

    使用 ParameterizedThreadStart 委托不是传递数据的类型安全的方法,因为 System.Threading.Thread.Start(System.Object) 方法重载接受任何对象。

    这种方法不推荐使用,故在此不做详细介绍,具体用法参见:http://msdn2.microsoft.com/zh-cn/library/system.threading.parameterizedthreadstart(VS.80).aspx

    ParameterizedThreadStart ParStart = new ParameterizedThreadStart(ThreadMethod);
    Thread myThread = new Thread(ParStart);
    object o = "hello";
    myThread.Start(o);
    
    //ThreadMethod如下:
    public void ThreadMethod(object ParObject)
    {
        //程序代码
    }
    

    第二种:将线程执行的方法和参数都封装到一个类里面。通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递参数。

    具体代码如下(本示例来自MSDN)

    
    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.");  
        }
    }
    
    

    ============================================================================

    展开全文
  • 在 .NET Framework 2.0 版中,要实现线程调用带参数的方法有两种办法。 第一种:使用ParameterizedThreadStart。 调用 System.Threading.Thread.Start(System.Object) 重载方法时将包含数据的对象传递给线程。 使用 ...

    在 .NET Framework 2.0 版中,要实现线程调用带参数的方法有两种办法。
    第一种:使用ParameterizedThreadStart。
    调用 System.Threading.Thread.Start(System.Object) 重载方法时将包含数据的对象传递给线程。
    使用 ParameterizedThreadStart 委托不是传递数据的类型安全的方法,因为 System.Threading.Thread.Start(System.Object) 方法重载接受任何对象。
    这种方法不推荐使用,故在此不做详细介绍,具体用法参见:http://msdn2.microsoft.com/zh-cn/library/system.threading.parameterizedthreadstart(VS.80).aspx

    ParameterizedThreadStart ParStart = new ParameterizedThreadStart(ThreadMethod);
    Thread myThread = new Thread(ParStart);
    object o = "hello";
    myThread.Start(o);
    //ThreadMethod如下:
    public void ThreadMethod(object ParObject)
    {
    //程序代码
    }

    第二种:将线程执行的方法和参数都封装到一个类里面。通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递参数。
    具体代码如下(本示例来自MSDN)

    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.");  
        }
    }

    ============================================================================

    方法一:
    在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)
    {
    // ....
    }

     

     

    引用: http://www.cnblogs.com/zyh-nhy/archive/2009/01/07/1371249.html

    转载于:https://www.cnblogs.com/chencidi/archive/2011/11/23/2260938.html

    展开全文
  • Java类用反射机制来调用带参数的方法碰到的一些问题关注:216答案:2mip版解决时间 2021-02-11 02:55提问者負袮、叕哬妨2021-02-10 14:45JSP在MVC模式下,前台每次请求到一个Servlet时,request对象中都带上一个表示...

    Java类用反射机制来调用带参数的方法碰到的一些问题

    关注:216  答案:2  mip版

    解决时间 2021-02-11 02:55

    e6cb1a03ad541b3098697807b7bf1798.png

    提问者負袮、叕哬妨

    2021-02-10 14:45

    JSP在MVC模式下,前台每次请求到一个Servlet时,request对象中都带上一个表示跳转动作的属性action,servlet根据这个action的值来调用相应的方法。其中,action的值和方法的名字是一样的,所以,可以使用class.getMethod(action).invoke方法来调用。我感觉这个想法是没有问题的,但是实际操作中出现了问题,代码描述如下:

    public class Servlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    doPost(request, response);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    String action = request.getParameter("action");

    //可以用if语句来判断并调用,但是当action很多时这样不方便

    //所以考虑利用反射机制根据action的值自动调用相应的方法

    try {

    Method m = this.getClass().getMethod(action, Object.class, Object.class);

    m.invoke(this.getClass().newInstance(), new Object[]{request, response})

    } catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    //将被调用的目标方法

    public void QueryAll(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    request.getRequestDispatcher("all.jsp").forward(request, response);

    }

    }

    实际运行的时候抛异常: java.lang.NoSuchMethodException:my.servlet.Servlet.QueryAll(java.lang.Object, java.lang.Object)

    问题是不是出在参数类型上?诚心求指教

    最佳答案

    e6cb1a03ad541b3098697807b7bf1798.png

    二级知识专家指间的落寞

    2021-02-10 14:56

    Method m = this.getClass().getMethod(action, Object.class, Object.class);

    这里改成:

    Method m = this.getClass().getMethod(action, HttpServletRequest.class, HttpServletResponse.class);

    ----------------------已经有人比我先回答了,呵呵。

    至于楼上说的第2点从效率上来说,改为this会快一些。

    全部回答

    e6cb1a03ad541b3098697807b7bf1798.png

    1楼嶶笑螚讓亼瘋鋽

    2021-02-10 15:33

    通过java反射调用无参数方法,这是个测试用的例子,通过反射调用对象的方法,代码如下:

    import java.lang.reflect.method;

    import java.lang.reflect.invocationtargetexception;

    public class testref {

    public static void main(string args[]) throws nosuchmethodexception, illegalaccessexception, invocationtargetexception {

    foo foo = new foo("这个一个foo对象!");

    class clazz = foo.getclass();

    method m1 = clazz.getdeclaredmethod("outinfo");

    method m2 = clazz.getdeclaredmethod("setmsg", string.class);

    method m3 = clazz.getdeclaredmethod("getmsg");

    m1.invoke(foo);

    m2.invoke(foo, "重新设置msg信息!");

    string msg = (string) m3.invoke(foo);

    system.out.println(msg);

    }

    }

    class foo {

    private string msg;

    public foo(string msg) {

    this.msg = msg;

    }

    public void setmsg(string msg) {

    this.msg = msg;

    }

    public string getmsg() {

    return msg;

    }

    public void outinfo() {

    system.out.println("这是测试java反射调用无参数方法的测试类");

    }

    }控制台输出结果:

    这是测试java反射调用无参数方法的测试类

    重新设置msg信息!

    process finished with exit code 0

    我要举报

    如以上问答内容为低俗/色情/暴力/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

    →点此我要举报以上信息!←

    推荐资讯

    大家都在看

    展开全文
  • 在 .NET Framework 2.0 版中,要实现线程调用带参数的方法有两种办法。 第一种:使用ParameterizedThreadStart。 调用 System.Threading.Thread.Start(System.Object) 重载方法时将包含数据的对象传递给线程。...

    在 .NET Framework 2.0 版中,要实现线程调用带参数的方法有两种办法。

    第一种:使用ParameterizedThreadStart。

    调用 System.Threading.Thread.Start(System.Object) 重载方法时将包含数据的对象传递给线程。

    使用 ParameterizedThreadStart 委托不是传递数据的类型安全的方法,因为 System.Threading.Thread.Start(System.Object) 方法重载接受任何对象。

    这种方法不推荐使用,故在此不做详细介绍,具体用法参见:http://msdn2.microsoft.com/zh-cn/library/system.threading.parameterizedthreadstart(VS.80).aspx

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

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



    第二种:将线程执行的方法和参数都封装到一个类里面。通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递参数。

    具体代码如下(本示例来自MSDN)

    复制代码
    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.");  
        }
    }
    复制代码

     

    ============================================================================

    方法一:
    在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#线程调用带参数的方法 ~   在 .NET Framework 2.0 版中,要实现线程调用带参数的方法有两种办法。 第一种:使用ParameterizedThreadStart。 调用 System.Threading.Thread.Start(System.Object) 重载方法...
  • 在 .NET Framework 2.0 版中,要实现线程调用带参数的方法有两种办法。第一种:使用ParameterizedThreadStart。调用 System.Threading.Thread.Start(System.Object) 重载方法时将包含数据的对象传递给线程。使用 ...
  • 我有一个有静态方法的类,它以Comparable []为参数.我需要找到并调用方法.我尝试了以下java反射class X{public static void sort(Comparable[] a){System.out.println("sorting");}public static void read...
  • 通过Java反射机制调用方法//20210204写在前面:最近再把Java反射和注释知识点过一遍,在这里记一下重要点,本文讲述反射机制创建对象并调用方法主要任务:使用类反射机制实现对象创建以及方法调用与普通方式实现...
  • JSP在MVC模式下,前台每次请求到一个Servlet时,request对象中都上一个表示跳转动作的属性action,servlet根据这个action的值来调用相应的方法。其中,action的值和方法的名字是一样...JSP在MVC模式下,前台每次...
  • 在 .NET Framework 2.0 版中,要实现线程调用带参数的方法有两种办法。第一种:使用ParameterizedThreadStart。调用 System.Threading.Thread.Start(System.Object) 重载方法时将包含数据的对象传递给线程。使用 ...
  • 使用 MethodInfo 调用带参数的方法

    千次阅读 2019-05-07 18:08:41
    //添加需要引用dll objCompilerParameters.ReferencedAssemblies.Add("System.dll"); objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll"); //是否生成可执行文件 ...
  • 在 .NET Framework 2.0 版中,要实现线程调用带参数的方法有两种办法。第一种:使用ParameterizedThreadStart。调用 System.Threading.Thread.Start(System.Object) 重载方法时将包含数据的对象传递给线程。使用 ...
  • EL表达式调用带参数的方法很简单,直接传入调用值即可 例如在项目中的这种用法:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,202
精华内容 2,880
关键字:

调用带参数的方法