Как выполнить функцию в главном приложении из фоновой задачи - PullRequest
2 голосов
/ 23 апреля 2019

В настоящее время я разрабатываю 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.");
    }
   }

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

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

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

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

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

0 голосов
/ 23 апреля 2019

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

MSDN Link https://docs.microsoft.com/en-us/windows/uwp/launch-resume/create-and-register-a-background-task

...