C# как близко пользовательская форма с рабочим потоком - PullRequest
1 голос
/ 11 февраля 2020

Я запускаю новый поток (рабочий) в пользовательской форме, когда этому потоку нужно что-то обновить в пользовательской форме, затем вызываю метод Invoke - вызывать делегат метода в основном потоке. Проблема в том, насколько успешно закрыть пользовательскую форму. Мне нужен первый раз конечный рабочий поток fini sh, из этого потока время называется основным потоком (Invoke). Как в основном потоке ждать, пока рабочий поток не завершится sh последний l oop.

Форма пользователя

  public partial class FormMain : Form
  {
    private bool isntSignaledStop=true;
    ...

Вот метод al oop, который выполняется в рабочем потоке.

private void MenuLoop()
{
  while (isntSignaledStop)
  {
    HeavyMethod();
    Invoke(DelegateWriteResultsToMenu);

    HeavyMethod2();
    Invoke(DelegateWriteResultsToMenu2);

    ...
  }
}

Основной поток в конце установлен isntSignaledStop = False. Теперь мне нужно дождаться окончания рабочего потока.

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

Вы можете использовать async/await подход и использовать tasks вместо threads. Перепроектируйте MenuLoop метод для возврата Task:

private volatile bool isntSignaledStop = true;
private async void ButtonStart_Click(object sender, EventArgs e)
{
    await MenuLoop();
    Close();
}

private Task MenuLoop()
{
    return Task.Run(() =>
    {
        while (isntSignaledStop)
        {
            HeavyMethod();
            Invoke(DelegateWriteResultsToMenu);

            HeavyMethod();
            Invoke(DelegateWriteResultsToMenu);
        }
    });
}
private void ButtonStop_Click(object sender, EventArgs e)
{
    isntSignaledStop = false;
}

В потоке пользовательского интерфейса вы можете асинхронно ждать, пока MenuLoop завершит работу, а затем закрыть окно.

0 голосов
/ 25 февраля 2020

Спасибо за помощь, но я надеюсь, что нашел способ сделать это с потоками. Запустите основной код в рабочем потоке. Поскольку сама пользовательская форма работает так, как мне нужно, она позволяет вводить данные пользователем или выполняет вызванный метод из другого потока, и если он ничего не делает, то ожидание ...

0 голосов
/ 11 февраля 2020

Если у вас MenuL oop, запущенный в «Thread2» (притворяясь, что это имя), я бы вызвал Thread2.Join () в вашем основном потоке, что заставит основной поток ждать, пока поток 2 не будет завершен.

Я бы порекомендовал прочитать этот пост, он получил действительно отличный ответ с 5 различными способами сделать это. Как дождаться окончания потока sh с помощью. NET?

Надеюсь, это поможет!

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