Заполните и покажите winform, используя данные текстового файла из Фонового потока - PullRequest
0 голосов
/ 06 февраля 2019

Я пишу приложение на 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

1 Ответ

0 голосов
/ 06 февраля 2019

Потоки в WinForm в надстройке VSTO требуют как многопотоковой операции для получения данных, так и проверки доступности формы для обновления.Ниже приведен более старый код с использованием делегатов из старой надстройки 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;
    }

Кстати, у меня есть более новый кодиспользование асинхронных операций;Я посмотрю, смогу ли я выкопать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...