locked
FAQs: 在VB.NET应用程序中使用多线程应该注意些什么?_ RRS feed

  • 问题

  • 为了帮助大家更好地学习 Visual Basic技术,微软论坛技术支持团队编辑了一些列的 "Visual Basic 常见问题及解答" 精华帖。

    本帖的主题是:在VB.NET应用程序中使用多线程应该注意些什么?

    如果您觉得这个帖子对您的学习、工作有所帮助,请再把这个帖子分享给你的同学、同事和朋友。

    如果您想阅读更多的 "Visual Basic 常见问题及解答",请打开索引页面:
    http://social.msdn.microsoft.com/Forums/zh-CN/vbasiczhchs/thread/c9ab4b8e-99dc-49a2-bcea-30f3ecc3c3b7


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    MSDN 论坛好帮手 立刻免费下载  MSDN 论坛好帮手
    2011年3月2日 11:50

答案

  • .NET应用程序可以通过多线程同时执行多个程序,不同的任务在不同的线程上执行。这样改善了应用程序的性能和响应时间。通常我们在使用多线程时要注意以下几点:

     

    §  使用BackgroundWorker类。BackgroundWorker类是由.NET类库2.0提供的。它可以很容易被用来在一个单独线程上执行一个操作。MSDN文档里有对它的功能及代码示例的全面解释。请阅读相关文档来理解其用法。

     

    §  在应用程序的多个线程间共享数据。我们需要使用线程同步机制来避免损毁数据。

     

    §  worker线程的主UI线程中修改窗体的属性。当worker线程的代码将要修改主UI线程的窗体的属性和控件时,我们需要使用Control.Invoke(或者BeginInvoke)方法来整理对正确的主UI线程的调用。

     

    §  异常处理。如果我们不在线程函数中处理异常,未处理的异常会强迫宿主进程退出。

     

    §  使用异步方法调用。异步方法调用是CLR提供的用来将异常流分成两支的功能。CLR使用工作队列来实现这种机制。它会将方法参数和目标方法的地址打包到一个请求消息,并把这个消息排列为一个流程范围内的消息队列。CLR维护着一个线程池来处理那个队列中的所有请求。

     

    你可以通过托管对象在.NET应用程序中使用异步方法调用功能。关于如何使用它请看下面的代码段。

     

    更多有关异步方法调用的信息,请参考下面文档:

    1)   .NET托管: .NET环境中进行异步方法调用:

    http://msdn.microsoft.com/zh-cn/magazine/cc301332.aspx

    2)   异步方法调用:

    http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx

     

    Imports System.Runtime.Remoting.Messaging

     

    Public Class Form1

     

        Public Delegate Function operationdelegate(ByVal num1 As Integer, ByVal num2 As Integer) As Integer

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Dim obj As New demo1

            Dim num1 As Integer = 111

            Dim num2 As Integer = 124

            Dim del As operationdelegate

            del = New operationdelegate(AddressOf obj.add)

            del.BeginInvoke(num1, num2, AddressOf Oncallback, Nothing)

            del = New operationdelegate(AddressOf obj.subtract)

            MessageBox.Show(del.Invoke(num1, num2).ToString)

    End Sub

     

        Private Sub Oncallback(ByVal asynresult As IAsyncResult)

            Dim result As Integer = 0

            Dim obj As AsyncResult = CType(asynresult, AsyncResult)

            Dim c As operationdelegate = CType(obj.AsyncDelegate, operationdelegate)

            result = c.EndInvoke(asynresult)

            MessageBox.Show(result.ToString)

    End Sub

     

    End Class

     

    Public Class demo1

     

        Public Function add(ByVal num1 As Integer, ByVal num2 As Integer) As Integer

            Return num1 + num2

    End Function

     

        Public Function subtract(ByVal num1 As Integer, ByVal num2 As Integer) As Integer

            Return num1 - num2

    End Function

     

    End Class

     

    更多有关在VB.NET中使用多线程的信息,请参考在Visual Basic .NET中的MSDN文档:

    http://msdn.microsoft.com/zh-cn/library/eed6swsx.aspx

     

    相关帖子:

    http://social.msdn.microsoft.com/forums/en-US/vbgeneral/thread/904de128-4dca-4a18-a48f-048e4761bd44/

    http://social.msdn.microsoft.com/Forums/en-US/vblanguage/thread/58a35975-2a71-4adc-86dd-5fc9d4605717/

    http://social.msdn.microsoft.com/forums/en-US/Vsexpressvb/thread/6e84ea77-a77c-4e05-a641-ffd8866d3f94/

    http://social.msdn.microsoft.com/forums/en-US/Vsexpressvb/thread/e1d8d23e-753d-48f7-b350-87832e0b95d6/

     

    2011年3月2日 11:50