• C#秘密武器之多线程——参数与返回值


    线程函数要么没有参数,要么只能有一个object参数,而且均没有返回值,这样就大大降低了程序的灵活性,其实我们想要的是能像普通方法一样正常使用参数和返回值!能不能实现这个需求呢?下面就介绍两种方法

    一、添加外壳方法

    原理:把参数传递变成了对变量的调用

    方法:定义一个专门的线程类。

    1、需要向线程传递的参数和返回值作为类的公共属性;

    2、线程函数的真正方法也放在该类里边

    3、加壳的线程函数也放在里边(真正调用的是2的方法)

    public class MyThread
    {
        public double X= 10;
        public double Y= 0;
    public double Result;
    public MyThread(int x,int y) { this.X= X;
    this.Y= y;
    }
    //真正方法 public double SomeFunc(double x,double y)
    {
    //加法运算等
    }
    //加壳方法
    public void Calculate() { Result = SomeFunc(X,Y);
    } } MyThread t=new MyThread(){X=1,Y=2}; ThreadStart threadStart=new ThreadStart(t.Calculate) Thread thread=new Thread(threadStart); thread.Start();
    thread.Join();
    Console.WriteLine(t.Result);
    }

    二、设计一个输入输出辅助类

    既然ParameterizedThreadStart委托类型的线程函数可以输入一个object类型的参数,那么我们就从这个类型的参数入手:将线程函数的“输入参数”和“返回值”封装在一个类里边,这个类的实例就作为这个唯一的object参数,上代码一切就明白了!

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                MyThread obj = new MyThread();
                ThreadMethodHelper argu = new ThreadMethodHelper();
                argu.x = 5;
                argu.y = 10;
                Thread t = new Thread(obj.SomeFunc);
                t.Start(argu);
                t.Join();
                Console.WriteLine(argu.returnValue);
                Console.Read();
            }
        }
        class ThreadMethodHelper
        {
            //方法参数
            public int x;
            public int y;
            //方法返回值
            public long returnValue;
        }
        class MyThread 
        {
            public void SomeFunc(object argu) 
            {
                long result = 0;
                int x = (argu as ThreadMethodHelper).x;
                int y = (argu as ThreadMethodHelper).y;
                result = x + y;
                (argu as ThreadMethodHelper).returnValue = result;
            }
        }
    }
  • 相关阅读:
    Java基本数据类型
    Java入门
    JavaSE概述
    ORACLE中的自治事务
    JDWP Transport dt socket failed to initialize
    jinfo命令 Java Configuration Info
    mysql的bind-address设置为127 0 0 1,通过localhost连接访问不了
    与MQ通讯的完整JAVA程序
    Hadoop入门进阶步步高(三)-配置Hadoop
    GC Root
  • 原文地址:https://www.cnblogs.com/WeiGe/p/4240564.html
Copyright © 2020-2023  润新知