调用其他线程调用的函数时,线程未启动

时间:2013-01-04 02:54:51

标签: .net vb.net multithreading

我正在使用线程在执行耗时操作(for循环)时显示进度窗口。在该操作之后我想停止线程。但方法“ ShowProgressDialog ”不是被调用。我在其他正常工作中使用相同的方法。下面是代码。

Private Sub TSBRSToLoc_Click(sender As System.Object, e As System.EventArgs) Handles TSBRSToLoc.Click
    Try

        If Not BWRRStoLoc.IsBusy Then
            Dim backgroundThred As New Thread(AddressOf ShowProgressDialog)
            backgroundThred.IsBackground = True
            'Dim formProgree As New ProgressForm
            backgroundThred.Start()
            DisableBtns(sender)
            ProgressBarCompare.Value = 0
            lblProgStatus.Text = ""

            Dim filesSize As Long = 0
            For index As Integer = 0 To ObjlsViewCompare.Items.Count - 1
                Dim file As File = ObjlsViewCompare.GetModelObject(index)
                If Not file.Status = MatchStatus.MisingOnRackSpace Then
                    filesSize = filesSize + file.SizeOnRackSpace
                End If
            Next
            ProgressBarCompare.Maximum = filesSize
            ' formProgree.Close()
            backgroundThred.Abort()
            backgroundThred.Join()
            BWRRStoLoc.RunWorkerAsync()
        End If
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

1:你几乎不想调用Thread.Abort - 它可能具有不可预测的效果,特别是当一个线程终止另一个线程时。 See MSDN for more information.

关闭线程的正确方法是使用某种消息来告诉线程自行退出 - 设置静态变量(线程定期检查),使用同步对象等。{{1}是一个很大的禁忌。

2:你的逻辑倒退:你在主线程上进行了耗时的操作(按钮点击事件处理程序显示这是你的主UI线程),你试图从后台显示你的进度对话框线程。

应该是相反的方法:你应该在click处理程序中设置后台处理的所有数据,显示进度对话框(假设它是无模式的),然后启动将进行处理的后台线程。

在处理过程中,后台线程应该继续通知进度窗口进度,一旦完成,它还应该通知进度窗口这个事实。

每当您需要通知您的UI线程时,您必须正确地将您的呼叫转移到正确的线程。这是因为任何UI元素只能从创建它的线程中访问 - 例如,您无法在不编组调用的情况下从工作线程设置标签控件的文本。

您需要使用InvokeRequired / BeginInvoke()进行封送处理。致电Thread.Abort()时,您将通过代表;这样的事情(抱歉C#语法,我不熟悉VB.NET - 应该很容易移植它):

BeginInvoke()

所有这一切都是因为控件通过消息处理许多属性更新,并且必须以正确的顺序同步传递这些消息。确保这一点(没有一些非常复杂的编码)的唯一方法是在线程运行消息泵的同一线程上创建所有控件。

有关在主UI线程以外的线程上创建UI的更多信息,请参阅this question。 (这是可能的,但如果你真的非常需要那么你只想这样做。那是非常罕见的。)