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 ...
随机推荐
- python 自定义过滤器
文件目录结构: 新建文件并且命名为“templatetags” , 然后复制 __init__.py文件,拷贝到templatetags文件夹里, __pycache__文件夹可以忽略哈,那是程序运行 ...
- 【最短路径】 SPFA算法
上一期介绍到了SPFA算法,只是一笔带过,这一期让我们详细的介绍一下SPFA. 1 SPFA原理介绍 SPFA算法和dijkstra算法特别像,总感觉自己讲的不行,同学说我的博客很辣鸡,推荐一个视频讲 ...
- UML功能模型(用例图)
在UML系统开发中有三个主要的模型:功能模型(从用户角度展示系统的功能,包括用例图).对象模型(采用对象,属性,操作关联等概念展示系统的结构和基础,包括类图.对象图.包图).动态模型(展示系统 ...
- 分解质因数法求最大公约数(javascrip实现)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 【BZOJ 4104】【THUSC 2015】解密运算
http://www.lydsy.com/JudgeOnline/problem.php?id=4104 网上题解满天飞,我也懒得写了 #include<cstdio> #include& ...
- 【动态规划】【二分】CDOJ1006 最长上升子序列
最长上升子序列. 要求输出字典序最小解. 就在更新答案的时候记录一下前驱.容易发现记录的这个玩意实际上形成了一个森林. #include<cstdio> #include<algor ...
- python基础之递归,匿名,内置函数
递归函数: 什么是递归函数? 函数递归调用:在调用一个函数的过程中,又直接或间接地调用了该函数本身. 递归必须要有两个明确的阶段: ①递推:一层一层递归调用下去,强调:每进入下一层问题规模减少 ②回溯 ...
- python基础之序列化 time random os
序列化与反序列化 json pickle 1.什么是序列化与反序列化? 序列化就是将内存中的数据结构转成一种中间格式储存到硬盘或者基于网络传输 反序列化是网络,硬盘将被序列化的对象重新读到内存 2. ...
- 1.4(SQL学习笔记)分组、子查询、联结、组合查询
一.分组 建表及数据填充语句下载:链接: https://pan.baidu.com/s/1WHYafwqKJEKq1kDwCH_Zlg 提取码: 3wy4 1.1初识分组 分组是按照某一列,将该列中 ...
- lnmp配置信息 4核8g优化
MYSQL my.conf# The following options will be passed to all MySQL clients[client]#password = ...