我正在vb.net(Outlook VSTO ADDIN)中编写一个应用程序,其中所有功能都在后台线程中运行,并在后台任务/循环期间将输出结果写入文本文件中,最后,当bg线程到达{ {1}}假设调用一个新的Winform RunWorkerCompleted
,其中新Winform的工作是读取更新的文本文件并显示数据。通过在Form1
中显示准确的数据,这对于bg线程第一次运行很好。但是当同一个bg任务在调度程序中定期运行时,Form1
会显示在初始运行期间显示的旧数据。
为进行测试,当我从按钮单击事件中调用Form1
时,它每次都会显示文本文件中的更新数据。但是,当Form1
在调度程序中从后台线程定期调用时,它确实读取了更新的文件,但显示了第一个bg线程调用中显示的旧数据。
Form1
。
我尝试按照建议遵循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
每次都显示更新的数据。但是,Im面临的另一个问题也是以前存在的。有时Form1
处于挂起状态,父应用程序(Outlook2013)保持响应。对于这个悬而未决的问题,我似乎找不到任何解决方案
Form1
答案 0 :(得分:0)
在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;
}
顺便说一句,我有一些使用异步操作的较新代码;我将看看是否可以进行挖掘。