从多线程过程返回值
由于这些过程不能为函数也不能使用 ByRef 参数,因而从运行于不同线程的过程返回值是很复杂的。 返回值的最简单方法是:使用 BackgroundWorker 组件来管理线程,在任务完成时引发事件,然后用事件处理程序处理结果。
下面的示例通过从运行于单独线程的某过程引发一个事件来返回值:
Private Class AreaClass2
Public Base As Double
Public Height As Double
Function CalcArea() As Double
' Calculate the area of a triangle.
Return 0.5 * Base * Height
End Function
End Class
Private WithEvents BackgroundWorker1 As New System.ComponentModel.BackgroundWorker
Private Sub TestArea2()
Dim AreaObject2 As New AreaClass2
AreaObject2.Base = 30
AreaObject2.Height = 40
' Start the asynchronous operation.
BackgroundWorker1.RunWorkerAsync(AreaObject2)
End Sub
' This method runs on the background thread when it starts.
Private Sub BackgroundWorker1_DoWork(
ByVal sender As Object,
ByVal e As System.ComponentModel.DoWorkEventArgs
) Handles BackgroundWorker1.DoWork
Dim AreaObject2 As AreaClass2 = CType(e.Argument, AreaClass2)
' Return the value through the Result property.
e.Result = AreaObject2.CalcArea()
End Sub
' This method runs on the main thread when the background thread finishes.
Private Sub BackgroundWorker1_RunWorkerCompleted(
ByVal sender As Object,
ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs
) Handles BackgroundWorker1.RunWorkerCompleted
' Access the result through the Result property.
Dim Area As Double = CDbl(e.Result)
MessageBox.Show("The area is: " & Area.ToString)
End Sub
-
classAreaClass2
- {
-
publicdoubleBase;
-
publicdoubleHeight;
-
publicdoubleCalcArea()
- {
-
//Calculatetheareaofatriangle.
-
return0.5*Base*Height;
- }
- }
-
-
privateSystem.ComponentModel.BackgroundWorkerBackgroundWorker1
- =newSystem.ComponentModel.BackgroundWorker();
-
-
privatevoidTestArea2()
- {
- InitializeBackgroundWorker();
-
- AreaClass2AreaObject2=newAreaClass2();
- AreaObject2.Base=30;
- AreaObject2.Height=40;
-
-
//Starttheasynchronousoperation.
- BackgroundWorker1.RunWorkerAsync(AreaObject2);
- }
-
-
privatevoidInitializeBackgroundWorker()
- {
-
//AttacheventhandlerstotheBackgroundWorkerobject.
- BackgroundWorker1.DoWork+=
-
newSystem.ComponentModel.DoWorkEventHandler(BackgroundWorker1_DoWork);
- BackgroundWorker1.RunWorkerCompleted+=
-
newSystem.ComponentModel.RunWorkerCompletedEventHandler(BackgroundWorker1_RunWorkerCompleted);
- }
-
-
privatevoidBackgroundWorker1_DoWork(
-
objectsender,
- System.ComponentModel.DoWorkEventArgse)
- {
- AreaClass2AreaObject2=(AreaClass2)e.Argument;
-
//ReturnthevaluethroughtheResultproperty.
- e.Result=AreaObject2.CalcArea();
- }
-
-
privatevoidBackgroundWorker1_RunWorkerCompleted(
-
objectsender,
- System.ComponentModel.RunWorkerCompletedEventArgse)
- {
-
//AccesstheresultthroughtheResultproperty.
-
doubleArea=(double)e.Result;
- MessageBox.Show("Theareais:"+Area.ToString());
- }
-
可以通过使用 QueueUserWorkItem 方法的可选 ByVal 状态对象变量为线程池线程提供参数和返回值。 线程计时器线程也支持将状态对象用于此目的。 有关线程池和线程计时器的信息,请参见 线程池(C# 和 Visual Basic) 和 线程计时器(C# 和 Visual Basic)。
分享到:
相关推荐
主要根据本人在UNIX系统上的编程实践经验总结而成, 既做为自己在 一个时期内编程实践的部分总结, 又可成为文章发表. 对UNIX程序员初学者来 说是一个小小的经验, 仅供参考;.../*子进程处理过程*/ exit(0); }
2、在线程Create()前调用InitializeCriticalSection()过程来初始化,该函数定义是: void WINAPI InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection); 类型lpCriticalSection即是Delphi封装的...
以前经常用VC编程的时候写的一个线程模板类 可以以类的任何方法作为线程过程启动 之后作为了简化 约定方法必须无返回值 且无参数 thread h总共30多行代码 下载者可随意修改 复制 希望对大家有用 用法示例: #...
临时写的,没咋完善,合适于新手用来提升,里面的c# 多线程简单应用,以及定义对象返回值提高通用性,过程日志防并发锁定写入,使用配置文件,可以随意配置运行以及间隔时间,以及xml配置监控站点信息。结构以主程序...
要不就是代码大多都很长而且使用了多线程(关于多线程的很多概念就够闹腾的了,扫描部分就更算了),让我等小菜都望而生畏;要不就是速度很慢,学会了也派不上用场。今天我就介绍一下自己学习winsock后写的端口扫描...
如目标窗口从属于一个不同的线程,则函数会立即返回。返回TRUE表示成功,FALSE表示出错。会设置GetLastError。 _关闭内核对象() 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。返回值非...
您查询的关键词是:delphi 同步 ...旧一篇:◆delphi多线程编程之二 ◆(乌龙哈里2008-10-12) | 新一篇:◆Delphi多线程编程之四 线程安全和VCL ◆(乌龙哈里2008-10-12)Csdn Blog version 3.1a Copyright © mygodsos
2.6 多线程编程 23 2.6.1 确保共享变量的可见性 23 2.6.2 确保共享变量的操作是原子的 24 2.6.3 不要调用Thread.run(),不要使用Thread.stop()以终止线程 26 2.6.4 确保执行阻塞操作的线程可以终止 26 2.6.5 ...
9.Java 支持多线程机制。( ) 填空题 17.Java中的的字符使用( )编码unicode 18. 在Java语言中,将源代码翻译成____________时产生的错误称为编译错误,而将程序在运行中产生的错误称为运行错误。字节码 13. Java...
第八部分 vb.net的多线程 1.自由线程(Free Threading) 2.关于线程的参数和返回值的问题 3.vb.net的并发性问题 第九部分 vb.net的文件和出错处理 1.vb.net的出错处理 2.vb.net的多种出错处理(Multiple Exceptions) 3....
第八部分 vb.net的多线程 1.自由线程(Free Threading) 2.关于线程的参数和返回值的问题 3.vb.net的并发性问题 第九部分 vb.net的文件和出错处理 1.vb.net的出错处理 2.vb.net的多种出错处理(Multiple Exceptions) 3....
X-scan 安全焦点出品的国内很优秀的扫描工具,采用多线程方式对指定IP地址段(或单机)进行安全漏洞检测,支持插件功能,提供了图形界面和命令行两种操作方式。 流光 国人的骄傲,由高级程序员小榕编写的一款强悍的...
(2)多线程可以用三种方式实现,继承thread类,实现runnable接口的实现类实例传入thread构造器创建thread实例, 实现callable接口的实现类实例传入future task构造器,将futuretask对象传入thread构造器,用...
70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...
70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...
多线程IDE——PL/SQL Developer是一个多线程IDE。这样,当SQL查询、PL/SQL程序、调试会话等正在运行时,您依然可以继续工作。而且,该多线程IDE还意味着出现编程错误时不会中止:您在任何时间都可以中断执行或保存...
而且,该多线程IDE还意味着出现编程错误时不会中止:您在任何时间都可以中断执行或保存您的工作。 易于安装 不同于SQL*Net,无需中间件,也无需数据库对象安装。只需点击安装程序按钮,您就可以开始安装从而使用...
1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...
14.1.2 针对用户界面的多线程 14.1.3 用主类合并线程 14.1.4 制作多个线程 14.1.5 Daemon线程 14.2 共享有限的资源 14.2.1 资源访问的错误方法 14.2.2 Java如何共享资源 14.2.3 回顾Java Beans 14.3 堵塞 ...
1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...