使用后台线程中的文本文件数据填充并显示winform



我在vb.net(Outlook VSTO ADDIN)中编写了一个应用程序,其中所有功能都在后台线程中运行,并在后台任务/循环期间将输出结果写入文本文件。最后,当bg线程到达RunWorkerCompleted时,它假设调用一个新的winformForm1,这个新的winform的任务是读取更新的文本文件并显示数据。这是bg线程第一次通过在CCD_ 3中显示准确的数据来运行。但是当相同的bg任务周期性地在调度器中运行时,CCD_。

为了进行测试,当我从按钮单击事件调用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

在VSTO加载项中的WinForm中执行线程操作既需要线程操作来获取数据,也需要检查表单是否可用于更新。下面是使用从服务接收消息的旧Excel VSTO加载项中的委托的旧代码,并根据前台的状态调用更新。

private delegate void StatusMessage();
/// <summary>
///     Simple methods for setting active cube list before connecting
/// </summary>
private void SetDefaultNode()
{
if (this.ActiveCubeStatus.InvokeRequired)
{
StatusMessage d = new StatusMessage(SetDefaultNodeDirect);
this.Invoke(d);
}
else
{
SetDefaultNodeDirect();
}
}
/// <summary>
///     Simple methods for setting active cube list before connecting
/// </summary>
private void SetDefaultNodeDirect()
{
//clears treeveiw
ClearActiveCubes();
//create default inactive node
TreeNode nodeDefault = new TreeNode();
nodeDefault.Name = "Waiting";
nodeDefault.Text = "Waiting on connection...";
this.ActiveCubeStatus.Nodes.Add(nodeDefault);
nodeDefault = null;
}

顺便说一句,我有一些使用异步操作的较新代码;我会看看能不能把它挖出来。

最新更新