C#中 多线程执行含有返回值的函数
-------------2017-06-09 更新-----------------------------------
如果你想不阻塞主线程地执行某个任务,并想在该任务结束时把结果显示在界面上,可以使用:
方法1:使用binding,在线程中改变结果值时手动notify。
方法2:使用ContinueWith
方法3:使用await、async
以下方法是个人的土办法,已经过时了。。
=================================================================================================================
C# 中,传统的多线程并不支持多线程执行含有返回结果的函数。虽然可以通过制作外壳类来使得返回结果得以保留,但如果一定时间内函数未执行完,简单的外壳类可能就无法满足需求了。
class netHelper
{
public static string sendResult = ""; public void yourFunction(Object obj)
{
Thread.Sleep(); sendResult = "the result after excuted";
}
}
如此一来,只要我们先多线程调用yourFunction,就可以在sendResult里获得结果。
那么问题来了,如过实际的函数像我上面写的一样,含有一个非常耗时间的操作,那么我们用来存储执行结果的变量可能就还没来得及被赋值,而什么时候能得到返回结果、有返回结果之后如何获得,也是个问题。
第二个是使用Task。
Task<string> yourTask = new Task<string>(()=>{Thread.Sleep(); MessageBox.Show("afterthis i go");} );
yourTask.Start();
string result = yourTask.result;
Task内部虽然保证了result只有在有结果的时候才会被赋值,但是同样,如果这个函数的执行时间非常长,你又在父级里调用了yourTask.Result,那么task就相当于阻塞运行;如果父进程是个ui进程,ui还会卡死。
解决方案是,新建一个线程,专门等待Task的返回结果,有结果返回再保存什么的。问题解决。
C#中 多线程执行含有返回值的函数的更多相关文章
- Swift2.0语言教程之函数的返回值与函数类型
Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...
- Selenium2学习-036-WebUI自动化实战实例-034-JavaScript 在 Selenium 自动化中的应用实例之六(获取 JS 执行结果返回值)
Selenium 获取 JavaScript 返回值非常简单,只需要在 js 脚本中将需要返回的数据 return 就可以,然后通过方法返回 js 的执行结果,方法源码如下所示: /** * Get ...
- paip.java 多线程参数以及返回值Future FutureTask 的使用.
paip.java 多线程参数以及返回值Future FutureTask 的使用. 在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是vo ...
- BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题
BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题 原文:http://www.sufeinet.com/thread-3707-1-1.html 大家可以先看看我上 ...
- 慕课网-Java入门第一季-7-3 Java 中无参带返回值方法的使用
来源:http://www.imooc.com/code/1579 如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值 ...
- Java 中无参带返回值方法的使用
如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值为 int 类型的方法,执行的操作为计算两数之和,并返回结果 在 c ...
- C#中的函数(二) 有参有返回值的函数
接上一篇 C#中的函数(-) 无参无返回值的函数 http://www.cnblogs.com/fzxiaoyi/p/8502613.html 这次研究下C#中的函数(二) 有参有返回值的函数 依然写 ...
- JavaScript 在函数中使用Ajax获取的值作为函数的返回值
解决:JavaScript 在函数中使用Ajax获取的值作为函数的返回值,结果无法获取到返回值 原因:ajax默认使用异步方式,要将异步改为同步方式 案例:通过区域ID,获取该区域下所有的学校 var ...
- python中os.system()的返回值
[python中os.system()的返回值] 如果第三方程序返回的是布尔型返回值,os.system会将true转为1,false转为0进行返回. 问题: /bin/xxx.py是一个返回码为1的 ...
随机推荐
- VB连接Mysql数据库
当然机器装有mysql数据库 然后下载安装Mysql,odbc驱动 须要加入ado'菜单"project"->"引用" 找 Microsoft Activ ...
- POJ 3026 Borg Maze
Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7998 Accepted: 2675 Descrip ...
- Android Studio升级后projectBuild failed.
近期在升级Android Studio后,发现原先能编译通过的project,突然就编译只是了,原因是生成的AndroidManifest.xml文件里有乱码. 升级后: android studio ...
- easyui textarea IE8中无法换行
经查 原代码textarea 应用了"textbox"css样式. 默认 white-space:nowrap; 修改为 "nornal",问题解决.
- yii2 rbac 设计
tbl_auth_item 根据type存储认证项目...role.task.operation 游客... 不能操作任何模块 普通用户 ..biz_rule..需要登录 只有这里返回true,才能进 ...
- SQL Server中内连接和外连接的区别
SQL Server中内连接和外连接的区别 假设一个数据库中有两张表,一张是学生表StudentInfo,一张是班级表ClassInfo,两张表之间用ClassId字段进行关联. 如果用内连接,正常的 ...
- Android WebView的使用方法总结
本文主要讲解WebView的一些常用使用方法 代码如下: xml文件: <LinearLayout xmlns:android="http://schemas.android.com/ ...
- Asp.Net 之 Web.config下Authorization节点
WebConfig Authorization 节点 授权的目的是确定是否应该授予某个标识对给定资源请求的访问权限类型.有两种基本方式来授予对给定资源的访问权限: [1] 文件授权 文件授权由 Fil ...
- Last non-zero Digit in N!
Problem Description The expression N!, read as "N factorial," denotes the product of the f ...
- JavaFX(一)窗口跳转
笔者此处不讲JavaFX的基础API,只针对笔者工作时遇到的问题进行记录与总结. 零基础的网友可以访问http://www.javafxchina.net/blog/docs/tutorial1/进行 ...