2011-06-07 48 views
1

问教程中,我有一个名为TestClass的的VB.NET线程

Public Class TestClass 

    Private _Count As Integer 


    Public ReadOnly Property Count() As Integer 
     Get 
      For i As Integer = 0 To 999999999 
       Threading.Thread.Sleep(100) 
      Next 

      Return 100 
     End Get 
    End Property 

End Class 

形成主窗体类,我调用类。这里是我的代码:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Dim tg As New TestClass 
    MsgBox(tg.Count) 

End Sub 

当我从主窗体调用tg.Count时,主窗体将不会响应。如何防止我的表单不响应。用户可以访问其他菜单而不是等待结果。谁能帮我?

回答

2

使用BackgroundWorker在工作线程中运行它。这将保持您的GUI响应。 http://www.dreamincode.net/forums/topic/88605-the-background-worker/

BackgroundWorker组件网络从工具箱拖到窗体上。现在,将您的计数器循环放入您自动生成的BackgroundWorker_DoWork事件处理程序中。您现在需要做的就是致电RunWorkerAsync

希望它能帮助!

+0

我知道如何使用后台工作。但是,我想知道如何将价值返回给它的来电者。你有没有看过短信库?当我调用msgbox(objGSM.IMEI)时,我可以访问应用程序中的其他菜单,而不用等待对象处理结果。 – Steven 2011-06-07 18:21:04

+0

您可以直接将值返回给GUI对象,并将其放在try ... catch块中。然后,跨线程调用不会大惊小怪。我仍然不明白你的问题。 – 2011-06-07 18:29:50

+1

+1:尽管如此,我确实为自己改进了格式和语法。 – 2011-06-07 18:34:29

0

您的循环正在从0循环到999999999,并且每循环中断当前线程的延迟时间为100毫秒。更好的解决方案是使用定时器,检查完成的条件并在必要时重新启动定时器。这样,您的主窗体线程将始终具有响应性。

+0

我知道如何使用后台工作者。但是,我想知道如何将价值返回给它的来电者。你有没有看过短信库?当我调用msgbox(objGSM.IMEI)时,我可以访问应用程序中的其他菜单,而不用等待对象处理结果。 – Steven 2011-06-07 18:21:16