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

一、添加外壳方法

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

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

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

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

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

public class MyThread
{
public double X= ;
public double Y= ;
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 = ;
argu.y = ;
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 = ;
int x = (argu as ThreadMethodHelper).x;
int y = (argu as ThreadMethodHelper).y;
result = x + y;
(argu as ThreadMethodHelper).returnValue = result;
}
}
}

C#秘密武器之多线程——参数与返回值的更多相关文章

  1. paip.java 多线程参数以及返回值Future FutureTask 的使用.

    paip.java 多线程参数以及返回值Future FutureTask 的使用. 在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是vo ...

  2. C#多线程函数如何传参数和返回值

          详见网站:http://WWW.MOVIH.COM就是一个多线程爬虫系统.   C#多线程函数如何传参数和返回值 提起多线程,不得不提起 委托(delegates)这个概念. 我理解的委托 ...

  3. 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

    [源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...

  4. java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)

    这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver  PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还 ...

  5. BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题

    BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题 原文:http://www.sufeinet.com/thread-3707-1-1.html      大家可以先看看我上 ...

  6. Spring框架下的 “接口调用、MVC请求” 调用参数、返回值、耗时信息输出

    主要拦截前端或后天的请求,打印请求方法参数.返回值.耗时.异常的日志.方便开发调试,能很快定位到问题出现在哪个方法中. 前端请求拦截,mvc的拦截器 import java.util.Date; im ...

  7. c&c++函数的参数和返回值的传递终结版

    c++函数的参数和返回值的传递方式有三种:值传递.指针传递和引用传递. 在这之前先看几个例子: 一, int a=10; int b=a; b+=10; 此时b是a的一个拷贝,改变b的值,a并不会受到 ...

  8. ObsoleteAttribute 可适用于除程序集、模块、参数或返回值以外的所有程序元素。 将元素标记为过时可以通知用户:该元素在产品的未来版本中将被移除。

    官方文档:https://msdn.microsoft.com/zh-cn/library/system.obsoleteattribute(v=vs.110).aspx 备注 ObsoleteAtt ...

  9. C#调用存储过程带输出参数或返回值

    CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGI ...

随机推荐

  1. CF 某套题 O :Grid (简单BFS)

    题意: 从左上角跳到右下角最少需要多少步,跳的规则为:可以向四个方向的任意一个方向跳当前格子中的步数,若跳不到右下角输出IMPOSSIBLE. 题解: BFS搜索,注意判断边界,标记. 代码: #in ...

  2. Java Class对象详解

    要怎样在java里来使用一个类,首先必须先把类的.class字节码文件加载进来,然后再进行连接对该类里的域分配内存,最后再调用构造器,如果该类有基类的话,会先去调用基类的构造器,总的来说,分为以下三个 ...

  3. 160. Intersection of Two Linked Lists【Easy】【求两个单链表的第一个交点】

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  4. 洛谷P3216 [HNOI2011] 数学作业 [矩阵加速,数论]

    题目传送门 数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N和 M,要求计算 Concatenate (1 .. N)Mod M 的值,其中 C ...

  5. Bzoj2818 Gcd(莫比乌斯反演)

    题面 题意都在题目里面了 题解 你可以把题意看成这个东西 $$ \sum_{i=1}^n\sum_{j=1}^m\mathbf f(gcd(i,j)) $$ 其中$\mathbf f(n)$为$是否是 ...

  6. CentOS7编译安装PostgreSQL

    创建组和用户 groupadd postgres useradd -g postgres postgres passwd postgres 编译安装 yum install -y gcc gcc-c+ ...

  7. EasyUI学习总结(一)——EasyUI入门(转载)

    本文转载自:http://www.cnblogs.com/xdp-gacl/p/4075079.html 一.EasyUI下载 EasyUI官方下载地址:http://www.jeasyui.com/ ...

  8. 安装SQL2008时显示必须重启计算机才可以继续安装的错误—解决办法

    数据库学习已经有一段时间了,前几天进入了SQL视频的学习,在安装数据库的时候,出现问题,总显示重启失败 ,无法继续安装,如图所示 出现这种问题 ,应该如何解决呢? 解决方法如下: (1).开始菜单-搜 ...

  9. Linux-Oracle 安装配置步骤

    一.打开 VMware 安装 VMware 解压 ORACLER11.2_redhat.rar 到 D:\...\machine\oracle-linux 打开 VMware, 选择 打开虚拟机 找到 ...

  10. CSS 笔记——背景布局

    4. 背景布局 -> 背景 (1)background 基本语法 background : background-color || background-image || background- ...