Приложение .Net зависает при добавлении при запуске - PullRequest
2 голосов
/ 05 мая 2011

Я создал небольшое многопоточное приложение с использованием VB.NET.Нет проблем, когда пользователь вручную запускает это приложение.Проблема существует, когда я добавил это приложение при запуске.Зависает после перезагрузки системы.Приложение все еще выполняет свой поток, но я не вижу его GUI, потому что он заморожен.Если я убью его в диспетчере задач и запустлю снова, приложение будет работать нормально.В чем может быть причина (ы), почему это приложение зависает при добавлении при запуске?

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 Framework служба еще не запущена.это возможно?

1 Ответ

1 голос
/ 05 мая 2011

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

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

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

...