CLR20R3 Ошибка - проблема рендеринга текста в изображение (включая многопоточность) - VB.net - PullRequest
0 голосов
/ 04 ноября 2011

У меня есть таймер, который срабатывает каждые полсекунды. Он вызывает фоновый процесс, который отображает текст в виде значков и использует их для значков уведомлений.

Public Shared DISCUS(9) As NotifyIcon
        Private Sub BackgroundProcess2_DoWork() Handles BackgroundProcess2.DoWork
           Try
              For counter As Integer = 0 To My.Computer.FileSystem.Drives.Count - 1
                    Dim FontColor As Color
                    If Math.Round((this / that) * 100, decimals:=0) < 25 Then
                        FontColor = Settings1.Default.CriticalColor
                    ElseIf Math.Round((this / that) * 100, decimals:=0) >= 25 And Math.Round((actualsize / ofsize) * 100, decimals:=0) < 50 Then
                        FontColor = Settings1.Default.WarningColor
                    Else
                        FontColor = Settings1.Default.NominalColor
                    End If
                    Dim BackColor As Color = Color.Transparent
                    Dim FontName As String = Settings1.Default.InterfaceFont.Name
                    Dim FontSize As Integer = 9
                    Dim iHeight As Integer = 16
                    Dim iWidth As Integer = 16
                    Dim objBitmap As New Bitmap(iWidth, iHeight)
                    Dim objGraphics As Graphics = Graphics.FromImage(objBitmap)
                    Dim objFont As New Font(FontName, FontSize)
                    Dim objPoint As New PointF(1, 0)
                    Dim objBrushForeColor As New SolidBrush(FontColor)
                    Dim objBrushBackColor As New SolidBrush(BackColor)
                    objGraphics.FillRectangle(objBrushBackColor, 0, 0, Width, Height)
                    objGraphics.DrawString(Text, objFont, objBrushForeColor, objPoint)
                    Dim img As Bitmap = objBitmap
                    Dim hIcon As IntPtr = img.GetHicon()
                    Dim icn As Icon = Icon.FromHandle(hIcon)
                    DISCUS(counter).Text = My.Computer.FileSystem.GetDriveInfo(My.Computer.FileSystem.Drives.Item(counter).ToString).VolumeLabel & vbCrLf & "Free space:" & vbCrLf & actualsize & stringvalue1 & " of " & ofsize & stringvalue2 & " (" & (Math.Round((this / that), decimals:=2) * 100) & "%)"
                    DISCUS(counter).BalloonTipText = Text
                    DISCUS(counter).Icon = icn
                    icn.Dispose()
                    DISCUS(counter).ContextMenuStrip = ContextMenuStrip1
                Next
            Catch ex as exception
                    My.Computer.FileSystem.WriteAllText(My.Computer.FileSystem.SpecialDirectories.Desktop & "\DT crash log.txt", "Log: " & My.Computer.Clock.LocalTime.Date.ToString & vbCrLf & o.ToString & vbCrLf & vbCrLf, True)
            End Try
        End Sub

Теперь по какой-то причине, после нескольких минут активности приложения, я получаю всплывающее окно JIT, которое не отображает текст или кнопки. Нажатие на него приводит к сбою JIT-отладчика, и я получаю Windows "{App} перестал отвечать". с кодом ошибки CLR20R3. Я не уверен, что это все, но я могу предоставить любые другие детали, если это необходимо. У меня есть все, что вложено в операторы Try / Catch, все с кодом для записи в журнал сбоев, но ничего не записывается, и я все еще получаю это сообщение об ошибке.

Может ли кто-нибудь дать мне указатели?

1 Ответ

1 голос
/ 04 ноября 2011

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

Если вы обновляете пользовательский интерфейс, вы должны использовать Invoke для объекта, который выполняется в потоке пользовательского интерфейса.Вот несколько ссылок, с которых можно начать:

Как я могу обновить свой пользовательский интерфейс из потока, который его не создавал?

Обновление пользовательского интерфейса из потока - самый простой способ

...