C#秘密武器之多线程——参数与返回值
线程函数要么没有参数,要么只能有一个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#秘密武器之多线程——参数与返回值的更多相关文章
- paip.java 多线程参数以及返回值Future FutureTask 的使用.
paip.java 多线程参数以及返回值Future FutureTask 的使用. 在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是vo ...
- C#多线程函数如何传参数和返回值
详见网站:http://WWW.MOVIH.COM就是一个多线程爬虫系统. C#多线程函数如何传参数和返回值 提起多线程,不得不提起 委托(delegates)这个概念. 我理解的委托 ...
- 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数
[源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...
- java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)
这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还 ...
- BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题
BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题 原文:http://www.sufeinet.com/thread-3707-1-1.html 大家可以先看看我上 ...
- Spring框架下的 “接口调用、MVC请求” 调用参数、返回值、耗时信息输出
主要拦截前端或后天的请求,打印请求方法参数.返回值.耗时.异常的日志.方便开发调试,能很快定位到问题出现在哪个方法中. 前端请求拦截,mvc的拦截器 import java.util.Date; im ...
- c&c++函数的参数和返回值的传递终结版
c++函数的参数和返回值的传递方式有三种:值传递.指针传递和引用传递. 在这之前先看几个例子: 一, int a=10; int b=a; b+=10; 此时b是a的一个拷贝,改变b的值,a并不会受到 ...
- ObsoleteAttribute 可适用于除程序集、模块、参数或返回值以外的所有程序元素。 将元素标记为过时可以通知用户:该元素在产品的未来版本中将被移除。
官方文档:https://msdn.microsoft.com/zh-cn/library/system.obsoleteattribute(v=vs.110).aspx 备注 ObsoleteAtt ...
- C#调用存储过程带输出参数或返回值
CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGI ...
随机推荐
- List 集合中 均匀的取七个点 的值
场景: 一个未知 长度的 List 集合,可能 长度为7,10,50,100, 等等 这个时候 ,我们需要在 集合中 均匀的取七个点: 思路: n=6; int size = list.Size(); ...
- CodeForces 731D 80-th Level Archeology
区间并. 对于上下两个数字,如果不一样,那么可以计算出哪一段范围内可以保证字典序,并且后面所有位置都无需再考虑.对所有范围求交集就是答案了. 求交集写起来有点烦,直接对不可取的范围求并即可. #pra ...
- Oracle实例,具体运用
Oracle关键字的使用 使用insert 添加数据: INSERT INTO 表名 VALUES (加入对应的数); COMMIT; INSERT INTO p_emp VALUES('TO ...
- 洛谷——P1920 成功密码
P1920 成功密码 题目描述 void_rank匪别人的书来看,原本想看杂志颓废的,结果不小心拿错拿成了被导师称作旁门左道的高中数学杂志<成功密码>.数学差得不行的void_rank实在 ...
- JZYZOJ1452 NOIP2015_提高组Day2_1_跳石头
http://172.20.6.3/Problem_Show.asp?id=1452很简单的二分,最开始以为是优先队列,想了想发现优先队列是有情况不能达到最优的,所以二分+贪心处理,在贪心check的 ...
- 【图论】Network of Schools
[POJ1236]Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18969 Acc ...
- 【动态规划+二分查找】POJ2533&POJ1631最长上升子序列(LIS)
POJ2533裸的LIS,时间复杂度为O(n^2) #include<iostream> #include<cstdio> using namespace std; +; in ...
- 【最大流FF模板】HDU1532&POJ1273
参照<挑战程序设计竞赛> #include<iostream> #include<cstdio> #include<cstdlib> #include& ...
- idea自动生成spring实体
创建Spring Boot项目 idea创建新项目 File->New->Project选择Spring Initializr默认使用官方的https://start.spring.io/ ...
- [转]No configuration found for the specified action解决办法
使用Struts2,配置一切正常,使用常用tag也正常,但是在使用<s:form>标记时,发现控制台总是输出警告信息, 警告信息内容如下: 警告: ...... <div> h ...