gpt4 book ai didi

vb.net - 为什么这个多线程VB.NET(2010 Express Edition)程序不能正常工作?

转载 作者:行者123 更新时间:2023-12-03 13:21:30 25 4
gpt4 key购买 nike

我正在尝试将我的程序制作成一个多线程应用程序,但我遇到了我在以下代码中记录的一对障碍。非常感谢我能获得的任何帮助以使其正常运行,因此我可以将此 stub 扩展到我现有应用程序的更高效版本。

感谢您对此事的任何建议。
- 亚伦

Imports System.Threading

Public Class frmMain

''' <summary>Initializes the multithreaded form</summary>

Private Sub Initialize() Handles MyBase.Load

AddThread(AddressOf Update_UI)

running = True

For Each Thread In ThreadPool

Thread.IsBackground = True

Thread.Start()

Next

End Sub



''' <summary>Terminates the multithreaded form</summary>

Protected Overrides Sub Finalize() Handles MyBase.FormClosing

running = False

For Each Thread In ThreadPool

Thread.Join()

Thread = Nothing

Next

End Sub



''' <summary>Adds a worker thread to the ThreadPool</summary>

''' <param name="pointer">The AddressOf the function to run on a new thread.</param>

Private Sub AddThread(ByRef pointer As System.Threading.ParameterizedThreadStart)

Dim newthread As Integer

If ThreadPool Is Nothing Then newthread = 0 Else newthread = ThreadPool.GetUpperBound(0) + 1

ReDim Preserve ThreadPool(newthread)

ThreadPool(newthread) = New Thread(pointer)

End Sub



''' <summary>Updates the User Interface</summary>

Private Sub Update_UI()

'HELP: The commented out lines in this subroutine make the program work incorrectly when uncommented.

'HELP: It should echo 'output' to the titlebar of frmMain, but it also makes the form unresponsive.
'HELP: When I force the form to quit, the 'termination alert' does not trigger, instead the application hangs completely on Thread.Join (see above).
'HELP: If I remove DoEvents(), the form is unable to be closed...it simply goes unresponsive. Shouldn't the multithreading keep us from needing DoEvents()?



'If Me.InvokeRequired Then

' Me.Invoke(New MethodInvoker(AddressOf Update_UI))

'Else

While running
Dim output As String = System.DateTime.Now + " :: Update_UI() is active!"

Debug.Print(output)
'Application.DoEvents()

'Me.Text = output

End While

Debug.Print(System.DateTime.Now + " :: Termination signal recieved...")

'End If

End Sub

Delegate Sub dlgUpdate_UI()



Private ThreadPool() As Thread

Private running As Boolean

End Class

最佳答案

是的,你尝试过的都不能正常工作。您正确地确定了需要使用 Control.Invoke() 在主线程上运行 Me.Text 分配。这就是问题所在:

  • 您的 Invoke() 调用使整个方法在主线程上运行。它将开始执行循环并且永远不会退出。你的表单变得紧张,因为它不能再做任何其他事情了,比如重新绘制标题栏以显示更改的文本或响应用户输入
  • DoEvents 调用使表单恢复活力,但现在您遇到了一个新问题:用户可以关闭窗口并且您的代码继续运行。 running 标志永远不会设置为 false,因此程序不会停止。用户界面虽然消失了。代码通常会轰炸 ObjectDisposedException 但在您的特定情况下不会,Text 属性存储在私有(private)变量
  • 您可以更改代码,以便仅 Me.Text 分配在主线程上运行。但是现在您遇到了一个新问题:主线程将受到调用请求的打击,并且不再执行其常规(低优先级)职责。它会紧张。根本问题是您尝试更新标题栏的速度太快了。没有意义,用户不能读得那么快。每秒更新 20 次就足够了,而且肉眼看起来很流畅
  • 不要对这样的任务使用 Finalize() 方法,代码很容易触发 2 秒的终结器线程超时,炸毁你的程序。

  • 请考虑使用 BackgroundWorker 类,它会处理其中一些细节。

    关于vb.net - 为什么这个多线程VB.NET(2010 Express Edition)程序不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7376442/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com