Как выполнить функцию в основном приложении из фоновой задачи

#c# #uwp #background-task

#c# #uwp #фоновая задача

Вопрос:

В настоящее время я разрабатываю HMI, который должен подключаться к удаленному серверу в той же сети, чтобы иметь возможность запуска. Для этого я использую функцию заставки платформы UWP, которая позволяет мне имитировать страницу загрузки.

Моя проблема в том, что я должен получить слово «пуск» от сервера, чтобы иметь возможность разблокировать мою заставку и передать приложение.

Итак, я попытался вызвать эту функцию непосредственно из моего фона, но неизбежно это не сработает.

Функции для выхода из заставки:

 void DismissedEventHandler(SplashScreen sender, object e)
{
    dismissed = true;
}

public void DismissExtendedSplash()
{
    rootFrame.Navigate(typeof(MainPage));
    Window.Current.Content = rootFrame;
}

void DismissSplashButton_Click(object sender, RoutedEventArgs e)
{
    DismissExtendedSplash();
}
  

SocketActivtyTask:

 case SocketActivityTriggerReason.SocketActivity:
   var socket = socketInformation.StreamSocket;
   DataReader reader = new DataReader(socket.InputStream);
   reader.InputStreamOptions = InputStreamOptions.Partial;
   await reader.LoadAsync(250);
   var dataString = reader.ReadString(reader.UnconsumedBufferLength);

   try
   {
      if (dataString.Equals("Start"))
      {
          Debug.WriteLine("Lancement OK.");
          DismissExtendedSplash();
      }
    }
    catch
    {
          Debug.WriteLine("Lancement FAIL.");
    }
   }
  

Как я могу заставить это работать?

Дополнительный вопрос, как отменить фоновую задачу при закрытии приложения?

Комментарии:

1. Как вы настроили фоновую задачу? Вы настроили ее для запуска в отдельном процессе? (Вероятно, поскольку это то, что делает большинство людей.) Если вы это сделаете, то при вызове DismissExtendedSplash вы не вызываете процесс переднего плана. Но зачем вообще использовать фоновую задачу? Пусть задача переднего плана прослушивает сокет.

2. Я использую фоновую задачу, потому что после работы в моей основной программе мне нужно получать информацию с сервера. Мне нужно получить сообщение и после этого сделать своего рода переключатель для выполнения другой задачи в моей основной программе.

3. Мое предложение состояло в том, чтобы процесс переднего плана перенял сокет у брокера сокетов при его запуске. Затем все это снова в одном процессе. (В качестве альтернативы, вы можете настроить фоновую задачу для запуска в том же процессе, что и приложение переднего плана.)

Ответ №1:

Никогда не выполняйте никаких задач, которые требуют времени из потока приложения. Это верный способ создать проблемы с производительностью (в лучшем случае) или взаимоблокировки (в худшем случае) в вашем приложении. Используйте BackgroundWorker для задач, которые потребуют времени. Используйте RunWorkerCompleted обработчик событий для обновления пользовательского интерфейса вашего приложения после выполнения задачи.

Вот относительно простой пример реализации BackgroundWorker класса: https://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners

Комментарии:

1. Привет, спасибо за ответ, но я не думаю, что это работает на UWP Plateform, это пример Windows Form. Мое приложение не заблокировано в ожидании ответа, позже в главном меню я также ожидаю простых сообщений. Невозможно просто вернуть полученное значение или переключить для выполнения других функций?

Ответ №2:

Я думаю, в вашем случае вам следует использовать то, что мы называем BackgroundTask, в качестве наилучшей практики. Для этого вам сначала необходимо реализовать IBackgroundTask в вашем приложении, что позволит вам запускать определенное событие.

Ссылка на MSDN https://learn.microsoft.com/en-us/windows/uwp/launch-resume/create-and-register-a-background-task

Комментарии:

1. Да, у меня уже есть фоновая задача в моем приложении. Я подробнее рассмотрю функцию запуска.