循环的背景工作者

时间:2014-05-22 08:49:53

标签: vb.net backgroundworker

我有一个vb.net应用程序,我希望a)可见,b)当activewindow设置为我的要求时最顶层 - 这部分我已经完成了。

我希望能够做的是使用背景工作者在一个连续的循环中主动监视它 - 再次我已经完成了这个。

我遇到的问题是,当我选择组合框时,由于bgw的干扰,我无法进行选择 - 几乎就像当我点击组合框来显示列表时,bgw似乎几乎点击了远离关闭列表的组合框。

非常感谢任何帮助。

这是我的代码:

Private Delegate Sub progressDelegate()

Private Sub frmApp_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Me.bgwActiveWindow.RunWorkerAsync()

End Sub

Private Sub bgwActiveWindow_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwActiveWindow.DoWork

    Dim CheckWindow As progressDelegate

    CheckWindow = New progressDelegate(AddressOf SetAppTopMost)
    Me.Invoke(CheckWindow)

    System.Threading.Thread.Sleep(100)

End Sub

Private Sub SetAppTopMost()

    Dim bol As Boolean

    If getActiveWindowTitle.IndexOf("Microsoft Outlook") <> -1 Or _
       getActiveWindowTitle.IndexOf(My.Settings.AppName) <> -1 Then
        bol = True
    Else
        bol = False
    End If

    Me.Visible = bol
    Me.TopMost = bol

End Sub

Private Sub bgwActiveWindow_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwActiveWindow.RunWorkerCompleted

    bgwActiveWindow.RunWorkerAsync()

End Sub

2 个答案:

答案 0 :(得分:1)

如Praveen所提到的那样,在设置之前检查状态,以防止再次将焦点设置到窗口。另外,每次都不要重新创建backworker线程:

Imports System.ComponentModel

Private Sub bgwActiveWindow_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles bgwActiveWindow.DoWork
    Do
        ' backworker code
        Threading.Thread.Sleep(1000)
    Loop While True
End Sub

当然,您要么必须实现'supportscancellation'垃圾,要么在主线程中设置一个标志,并在每个循环中轮询该标志,如果要取消则退出/退出。

你也可以使用一个不会锁定线程的计时器。

答案 1 :(得分:0)

我认为你应该在你的SetAppTopMost子中添加一个额外的检查。

if Me.Visible = True then exit sub

此行应为第1行。由于你试图每隔100毫秒显示一次表格,你就会失去焦点。