从多线程过程返回值

本文介绍了一种在多线程环境下返回值的方法,利用BackgroundWorker组件管理线程并触发事件,通过事件处理程序获取结果。同时介绍了如何使用QueueUserWorkItem方法为线程池线程提供参数和返回值。

从多线程过程返回值

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值