Я пишу приложение на vb.net (Outlook VSTO ADDIN), где все функции выполняются в фоновом потоке, и записывает результаты вывода в текстовый файл во время фоновых задач / циклов. Наконец, когда поток bg достигает RunWorkerCompleted
это предполагает вызов новой winform Form1
, где задачей этой новой winform является чтение обновленного текстового файла и отображение данных.это отлично работает в первый раз, когда поток bg работает, показывая точные данные в Form1
.но когда одна и та же задача bg периодически запускается в планировщике, Form1
показывает старые данные, которые были показаны во время первоначального запуска.
Для тестирования, когда я вызываю Form1
от события нажатия кнопки, каждый раз отображаются обновленные данные из текстового файла.Но когда Form1
периодически вызывается из фонового потока в планировщике, он действительно читает обновленный файл, но показывает старые данные, которые были показаны в первом вызове потока bg.
Shared Form1 As New Form1
Public Shared Sub BgWorker_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BgWorker.RunWorkerCompleted
'some other codes
Form1.Show()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
CheckForIllegalCrossThreadCalls = False
LoadData()
End Sub
Public Sub LoadData()
If File.Exists(FilePath..) Then
'Read the file, process the data and show
End If
End Sub
.
Обновление
Я пытался следовать InvokeRequired
, как предлагалось, и теперь Form1
каждый раз показывает обновленные данные.Но есть еще одна проблема, с которой я столкнулся, которая существовала и раньше.Иногда Form1
зависает при загрузке, а родительское приложение (Outlook2013) остается без ответа.Кажется, я не могу найти решение этой проблемы с зависанием
If Form1.InvokeRequired Then
Form1.Invoke(Sub()
Form1.LoadData()
End Sub)
Form1.Show()
Else
Form1.Show() : Form1.LoadData()
End If