2011-05-05 3 views
2

Я создал небольшое многопоточное приложение с использованием VB.NET. Нет проблем, когда пользователь вручную запускает это приложение. Проблема возникает, когда я добавлял это приложение при запуске. Он зависает после перезагрузки системы. Приложение по-прежнему работает в своем потоке, но я не вижу его графического интерфейса, потому что он заморожен. Если я убью его в диспетчере задач и снова запустил, приложение работает нормально. Какая возможная причина/причина, по которой это приложение зависает при добавлении при запуске?.Net Приложение зависает при добавлении при запуске

Imports System.Threading 

Public Class USBLock 

    Public Event Lock() 

    Public Event Unlock() 

    Dim monitorThread As Thread 

    Public Sub StartMonitoring() 
    monitorThread = New Thread(AddressOf MonitorNow) 
    monitorThread.Start() 
    End Sub 

    Public Sub StopMonitoring() 
    Try 
     monitorThread.Abort() 
    Catch ex As Exception 

    End Try 

    GC.Collect() 
    End Sub 

    Private Sub MonitorNow() 
    'LOOP HERE 

    If xValid Then 
     ' Enable Block Keyboard 
     ' Hides Taskbar 
     ' Disables Task Manager 
     RaiseEvent Unlock() 
    Else 
     ' Disable Block Keyboard 
     ' Shows Taskbar 
     ' Enables Task Manaer 
     RaiseEvent Lock() 
    End If 

    Thread.Sleep(1000) 
    GC.Collect() 

    MonitorNow() 
    End Sub 

End Class 

Imports System.Reflection  
Imports System.IO 

Public Class frmMain 

    Friend WithEvents xMonitor As New USBLock 
    Dim xCommandLineArgs As System.Collections.ObjectModel.ReadOnlyCollection(Of String) 
    Dim xState As Boolean = False 
    Dim xFrmLock As Boolean 

    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     xFrmLock = False 
     userEnd = False 

     If Not (xCommandLineArgs.Contains("-s") Or xCommandLineArgs.Contains("-S")) Then 
     MyBase.WindowState = FormWindowState.Normal 
     End If 
    End Sub 

    Public Sub New() 
     MyBase.New() 
     InitializeComponent() 
     nIcon.Visible = True 
     xCommandLineArgs = My.Application.CommandLineArgs 

     If xCommandLineArgs.Contains("-s") Or xCommandLineArgs.Contains("-S") Then 
     nIcon.Icon = Drawing.Icon.FromHandle(CType(imgIcon.Images(1), Bitmap).GetHicon()) 
     MyBase.Visible = False 
     MyBase.WindowState = FormWindowState.Minimized 
     StartMonitor() 
     Else 
     nIcon.Icon = Drawing.Icon.FromHandle(CType(imgIcon.Images(3), Bitmap).GetHicon()) 
     End If 

    End Sub 

    Private Sub lockPC() Handles xMonitor.Lock 

     If Not xFrmLock Then 
     frmLock.Show() 
     xFrmLock = True 
     nIcon.ShowBalloonTip(500, "Key Not Found", "PC has been locked!", ToolTipIcon.Error) 
     End If 

    End Sub 

    Private Sub UnlockPC() Handles xMonitor.Unlock 

     If xFrmLock Then 
     frmLock.Close() 
     xFrmLock = False 
     nIcon.ShowBalloonTip(500, "Key Found", "PC has been unlocked!", ToolTipIcon.Info) 
     End If 

    End Sub 

    Private Sub StartMonitor() 
     'some codes here 
     xMonitor.StartMonitoring() 
     Me.Refresh() 
    End Sub 

    Private Sub StopMonitor() 
     ' some codes here 
     xMonitor.StopMonitoring() 
    End Sub 

    Private Sub btnOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click 
     StartMonitor() 
    End Sub 

    Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click 
     StopMonitor() 
    End Sub   
End Class 

или просто мысли по этому поводу: почему программа зависает при запуске, потому что загружается приложение в то время как структура .net служба еще не началась. Является ли это возможным?

+0

О каком сервисе .NET вы говорите? –

ответ

1

Я заметил несколько вопросов.

  1. Вызов Thread.Abort в StopMonitoring - это не очень хорошая идея. Вы должны использовать более безопасный механизм, который позволяет потоку изящно заканчиваться.
  2. Я не вижу смысла звонить GC.Collect вручную. В большинстве случаев это лишнее, и это может сделать ваше приложение хуже.
  3. Рекурсивный вызов MonitorNow в конечном итоге приведет к StackOverflowException.
  4. StartMonitor вызывается из конструктора Form. Это означает, что существует вероятность того, что рабочий запускается до создания цикла сообщений. Эта проблема усугубляется тем фактом, что обработчики событий USBLock пытаются коснуться элементов пользовательского интерфейса, которые требуют, чтобы этот цикл сообщений был создан первым.
  5. Обработчики событий USBLock входят в рабочий поток, а затем пытаются коснуться элементов пользовательского интерфейса. Это абсолютно не допускается. Это приведет к непредсказуемости и эффекту приложения.

Несмотря на все это, трудно сказать, почему приложение зависает при запуске. Я хотел бы сосредоточиться на решении проблем выше, а затем на публикации другого вопроса.

Смежные вопросы