`
javatome
  • 浏览: 825190 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

从多线程过程返回值

 
阅读更多

从多线程过程返回值

由于这些过程不能为函数也不能使用 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

  1. classAreaClass2
  2. {
  3. publicdoubleBase;
  4. publicdoubleHeight;
  5. publicdoubleCalcArea()
  6. {
  7. //Calculatetheareaofatriangle.
  8. return0.5*Base*Height;
  9. }
  10. }
  11. privateSystem.ComponentModel.BackgroundWorkerBackgroundWorker1
  12. =newSystem.ComponentModel.BackgroundWorker();
  13. privatevoidTestArea2()
  14. {
  15. InitializeBackgroundWorker();
  16. AreaClass2AreaObject2=newAreaClass2();
  17. AreaObject2.Base=30;
  18. AreaObject2.Height=40;
  19. //Starttheasynchronousoperation.
  20. BackgroundWorker1.RunWorkerAsync(AreaObject2);
  21. }
  22. privatevoidInitializeBackgroundWorker()
  23. {
  24. //AttacheventhandlerstotheBackgroundWorkerobject.
  25. BackgroundWorker1.DoWork+=
  26. newSystem.ComponentModel.DoWorkEventHandler(BackgroundWorker1_DoWork);
  27. BackgroundWorker1.RunWorkerCompleted+=
  28. newSystem.ComponentModel.RunWorkerCompletedEventHandler(BackgroundWorker1_RunWorkerCompleted);
  29. }
  30. privatevoidBackgroundWorker1_DoWork(
  31. objectsender,
  32. System.ComponentModel.DoWorkEventArgse)
  33. {
  34. AreaClass2AreaObject2=(AreaClass2)e.Argument;
  35. //ReturnthevaluethroughtheResultproperty.
  36. e.Result=AreaObject2.CalcArea();
  37. }
  38. privatevoidBackgroundWorker1_RunWorkerCompleted(
  39. objectsender,
  40. System.ComponentModel.RunWorkerCompletedEventArgse)
  41. {
  42. //AccesstheresultthroughtheResultproperty.
  43. doubleArea=(double)e.Result;
  44. MessageBox.Show("Theareais:"+Area.ToString());
  45. }

可以通过使用 QueueUserWorkItem 方法的可选 ByVal 状态对象变量为线程池线程提供参数和返回值。 线程计时器线程也支持将状态对象用于此目的。 有关线程池和线程计时器的信息,请参见 线程池(C# 和 Visual Basic)线程计时器(C# 和 Visual Basic)

分享到:
评论

相关推荐

    UNIX 多线程多进程编程

    主要根据本人在UNIX系统上的编程实践经验总结而成, 既做为自己在 一个时期内编程实践的部分总结, 又可成为文章发表. 对UNIX程序员初学者来 说是一个小小的经验, 仅供参考;.../*子进程处理过程*/ exit(0); }

    Delphi多线程编程之三 同步读写全局数据

    2、在线程Create()前调用InitializeCriticalSection()过程来初始化,该函数定义是: void WINAPI InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection); 类型lpCriticalSection即是Delphi封装的...

    线程模板类(c++),简化线程创建。

    以前经常用VC编程的时候写的一个线程模板类 可以以类的任何方法作为线程过程启动 之后作为了简化 约定方法必须无返回值 且无参数 thread h总共30多行代码 下载者可随意修改 复制 希望对大家有用 用法示例: #...

    c# .net 的多线程网站异常监控以及服务器响应速度监控Console源代码

    临时写的,没咋完善,合适于新手用来提升,里面的c# 多线程简单应用,以及定义对象返回值提高通用性,过程日志防并发锁定写入,使用配置文件,可以随意配置运行以及间隔时间,以及xml配置监控站点信息。结构以主程序...

    用C自己编写端口扫描软件

    要不就是代码大多都很长而且使用了多线程(关于多线程的很多概念就够闹腾的了,扫描部分就更算了),让我等小菜都望而生畏;要不就是速度很慢,学会了也派不上用场。今天我就介绍一下自己学习winsock后写的端口扫描...

    中文API支持库(1.0-0

    如目标窗口从属于一个不同的线程,则函数会立即返回。返回TRUE表示成功,FALSE表示出错。会设置GetLastError。 _关闭内核对象() 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。返回值非...

    在同步代码结束后,使用ReleaseMutex(THandle

    您查询的关键词是:delphi 同步 ...旧一篇:◆delphi多线程编程之二 ◆(乌龙哈里2008-10-12) | 新一篇:◆Delphi多线程编程之四 线程安全和VCL ◆(乌龙哈里2008-10-12)Csdn Blog version 3.1a Copyright © mygodsos

    java,c/c++,php,c#安全编码规范

    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 ...

    java综合试题(面试题)

    9.Java 支持多线程机制。( ) 填空题 17.Java中的的字符使用( )编码unicode 18. 在Java语言中,将源代码翻译成____________时产生的错误称为编译错误,而将程序在运行中产生的错误称为运行错误。字节码 13. Java...

    vb.net基本入门学习资料.doc

    第八部分 vb.net的多线程 1.自由线程(Free Threading) 2.关于线程的参数和返回值的问题 3.vb.net的并发性问题 第九部分 vb.net的文件和出错处理 1.vb.net的出错处理 2.vb.net的多种出错处理(Multiple Exceptions) 3....

    vb.net基本入门学习资料

    第八部分 vb.net的多线程 1.自由线程(Free Threading) 2.关于线程的参数和返回值的问题 3.vb.net的并发性问题 第九部分 vb.net的文件和出错处理 1.vb.net的出错处理 2.vb.net的多种出错处理(Multiple Exceptions) 3....

    x-scan-v3.3-cn

    X-scan 安全焦点出品的国内很优秀的扫描工具,采用多线程方式对指定IP地址段(或单机)进行安全漏洞检测,支持插件功能,提供了图形界面和命令行两种操作方式。 流光 国人的骄傲,由高级程序员小榕编写的一款强悍的...

    LeetCode判断字符串是否循环-java:Java

    (2)多线程可以用三种方式实现,继承thread类,实现runnable接口的实现类实例传入thread构造器创建thread实例, 实现callable接口的实现类实例传入future task构造器,将futuretask对象传入thread构造器,用...

    千方百计笔试题大全

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    java面试宝典

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    PLSQLDeveloper下载

    多线程IDE——PL/SQL Developer是一个多线程IDE。这样,当SQL查询、PL/SQL程序、调试会话等正在运行时,您依然可以继续工作。而且,该多线程IDE还意味着出现编程错误时不会中止:您在任何时间都可以中断执行或保存...

    PL/SQL Developer8.04官网程序_keygen_汉化

    而且,该多线程IDE还意味着出现编程错误时不会中止:您在任何时间都可以中断执行或保存您的工作。 易于安装  不同于SQL*Net,无需中间件,也无需数据库对象安装。只需点击安装程序按钮,您就可以开始安装从而使用...

    Thinking in Java 中文第四版+习题答案

    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 阶段...

    Think in Java(中文版)chm格式

    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 堵塞 ...

    JAVA_Thinking in Java

    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 阶段...

Global site tag (gtag.js) - Google Analytics