BackGroundWorker未能更新RichTextBox(独立类)VB.NET
我开发了一个应用程序,我将它分解为“更简单”的术语,只是为了解释我遇到的问题 该应用程序有一个具有DoWork、Completed和ProgressChanged方法的BackGroundWorker。它位于“Main”类中,然后我有一个“ScheduledSend”类,该类包含带有TimedEvent处理程序的代码,以便当Time=X时,它为BGW执行RunWorkerASync 这是因为我通过强制按下按钮或超时“计划”执行来处理应用程序 然后在“Main”窗体上有一个RichTextBox,用于在进程运行时显示日志信息 问题 当应用程序使用强制按钮运行时,rich textbox日志会正确更新,但是当它使用计划发送运行时,它根本不会更新,请有人向我解释为什么会出现这种情况 我在下面用“更简单”的术语详细描述了代码BackGroundWorker未能更新RichTextBox(独立类)VB.NET,vb.net,Vb.net,我开发了一个应用程序,我将它分解为“更简单”的术语,只是为了解释我遇到的问题 该应用程序有一个具有DoWork、Completed和ProgressChanged方法的BackGroundWorker。它位于“Main”类中,然后我有一个“ScheduledSend”类,该类包含带有TimedEvent处理程序的代码,以便当Time=X时,它为BGW执行RunWorkerASync 这是因为我通过强制按下按钮或超时“计划”执行来处理应用程序 然后在“Main”窗体上有一个RichTextBox,
Public Class Main
'Timer Variables
Private Shared aTimer As System.Timers.Timer
Private Shared aTimerTime As Integer
Private Sub Main_Load(sender As Object, e As EventArgs) Handles Me.Load
'Setup the Scheduled Send Timers
aTimerTime = (1000)
aTimer = New System.Timers.Timer(aTimerTime) '1000 = 1 second, 60000 = 1 minute
AddHandler aTimer.Elapsed, AddressOf ScheduledSend.OnTimedEvent
aTimer.Enabled = True
End Sub
Private Sub SendManFileBtn_Click(sender As Object, e As EventArgs) Handles SendManFileBtn.Click
Try
LogFileRTB.Text = ""
TSProgBar.MarqueeAnimationSpeed = 100
BGW1BuildXML.RunWorkerAsync()
Catch ex As Exception
ErrorLogging.ReportError(ex)
End Try
End Sub
Private Sub BGW1BuildXML_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BGW1BuildXML.ProgressChanged
Try
LogFileRTB.AppendText(DateTime.Now.ToLongTimeString & " " & e.UserState.ToString & Environment.NewLine)
Catch ex As Exception
ErrorLogging.ReportError(ex)
End Try
End Sub
End Class
Public Class ScheduledSend
Public Shared Sub OnTimedEvent(ByVal source As Object, ByVal e As ElapsedEventArgs)
Try
Console.WriteLine(e.SignalTime.ToLongTimeString)
Console.WriteLine(My.Settings.schTimer.ToLongTimeString)
If e.SignalTime.ToLongTimeString = My.Settings.schTimer.ToLongTimeString Then
Console.WriteLine("Scheduled Timer Activated...")
Main.BGW1BuildXML.ReportProgress(0, "Scheduled Timer Activated...")
Main.BGW1BuildXML.RunWorkerAsync()
End If
Catch ex As Exception
ErrorLogging.ReportError(ex)
End Try
End Sub
End Class
因此,我添加了主表单加载,这是它设置计时器的地方,Btn点击“强制”正确使用BGWReportProgress的进程,并通过ReportProgress方法更新RichTextBox
然后,“ScheduledSend”类有一个“Timed”方法,当2个变量的时间与它启动的时间相匹配时,它不会正确更新RichTextBox,如下所示:
Main.BGW1BuildXML.ReportProgress(0, "Scheduled Timer Activated...")
将RichTextbox留空
任何帮助都将不胜感激。这似乎是该功能的一个逆火。ScheduledSend类如何知道哪个主窗体实例包含要更新的RichTextBox?@Steve在“ProgressChanged”中,我实际上只是用LogFileRTB.AppendText(DateTime.Now.ToLongTimeString&“”&e.UserState.ToString&Environment.NewLine)引用RichTextBox我知道,但您似乎是从默认表单实例调用它,而不是从实际的主实例调用它。我会尝试将公共共享属性添加到与主窗体类型相同的ScheduleSend类中。然后,在Main_Load中,将属性设置为OnTimedEvent中的当前实例(Me),在调用ReportProgress时使用该属性。OnTimedEvent()方法在工作线程上运行。它会创建一个主类的新实例,BGW会更新该实例。不是你正在看的那个。忘记使用可怕的默认实例功能确实需要进行大脑移植,但目前很难进行。使用System.Timers.Timer没有任何意义,通过使用常规Winforms计时器及其勾号事件来实现。因此,我是否需要“取消学习”默认实例功能以使其正常工作,或者将System.Timers.Timer更改为常规Winforms计时器并勾号事件来解决问题?为各位的建议干杯。