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

时间:2019-02-06 10:54:48

标签: vb.net winforms

我正在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

1 个答案:

答案 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;
    }

顺便说一句,我有一些使用异步操作的较新代码;我将看看是否可以进行挖掘。