Как лучше всего объявить соединение моего сокета и моего места на заднем плане? - PullRequest
0 голосов
/ 24 апреля 2019

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

При запуске HMI появляется расширенный экран-заставка с индикатором выполнения. Чтобы разблокировать автозагрузку, вы должны получить «launch_ok» с сервера, после чего у нас есть доступ к главной странице, которая позволяет управлять вызовами.

В настоящее время я объявляю все в моем файле: ExtendedSplash.xaml.cs

Я объявляю свой новый сокет с этими настройками, запускаю его, а затем запускаю фоновую активность.

У меня также есть некоторые ошибки: "Exception levée: 'System.NullReferenceException'"

ExtendedSplash.xaml.cs (Извлечение):

namespace PhoneCenter
{
partial class ExtendedSplash : Page
   {
    // SOCKET CONFIGURATION
    private const string socketId = "SampleSocket"; 
        private StreamSocket socket = null;
        private IBackgroundTaskRegistration task = null;
    private const string port = "40404";        
    private const string adress = "172.16.161.80"; 
}
public ExtendedSplash(SplashScreen splashscreen, bool loadState)
   {
        InitializeComponent();
        Window.Current.SizeChanged += new WindowSizeChangedEventHandler(ExtendedSplash_OnResize);
            splash = splashscreen;
    Debug.WriteLine("Création de la tâche d'arrière plan");
            StartBackgroundTask();
        Debug.WriteLine("Connexion Socket ...");
        StartConnexionServeurLTO();

            if (splash != null)
            {
            splash.Dismissed += new TypedEventHandler<SplashScreen, object>(DismissedEventHandler);
            splashImageRect = splash.ImageLocation;
            PositionImage();
            PositionRing();
            PositionTextBlock();
            }
        rootFrame = new Frame();
        RestoreState(loadState);
    }
// CONNEXION SOCKET
    private async void StartConnexionServeurLTO()
    {
        ApplicationData.Current.LocalSettings.Values["hostname"] = adress;
        ApplicationData.Current.LocalSettings.Values["port"] = port;

        try
        {
            SocketActivityInformation socketInformation;
            if (!SocketActivityInformation.AllSockets.TryGetValue(socketId, out socketInformation))
            {
                Debug.WriteLine("Boucle");
                socket = new StreamSocket();
                socket.EnableTransferOwnership(task.TaskId, SocketActivityConnectedStandbyAction.Wake);
                var targetServer = new HostName(adress);
                await socket.ConnectAsync(targetServer, port);
                DataReader reader = new DataReader(socket.InputStream);
                reader.InputStreamOptions = InputStreamOptions.Partial;
                var read = reader.LoadAsync(250);
                read.Completed += (info, status) =>
                {

                };
                await socket.CancelIOAsync();
                socket.TransferOwnership(socketId);
                socket = null;
            }
        }
        catch
        {
            Debug.WriteLine("Echec dans la connexion au serveur");
        }
    }
// LANCEMENT TÂCHE EN ARRIERE PLAN
    private void StartBackgroundTask()
    {
        try
        {
            foreach (var current in BackgroundTaskRegistration.AllTasks)
            {
                if (current.Value.Name == "PhonieMarthaBackground")
                {
                    task = current.Value;
                    break;
                }
            }
            if (task == null)
            {
                var socketTaskBuilder = new BackgroundTaskBuilder();
                socketTaskBuilder.Name = "PhonieMarthaBackground";
                socketTaskBuilder.TaskEntryPoint = "PhonieMarthaBackground.SocketActivityTask";
                var trigger = new SocketActivityTrigger();
                socketTaskBuilder.SetTrigger(trigger);
                task = socketTaskBuilder.Register();
            }

            SocketActivityInformation socketInformation;
            if (SocketActivityInformation.AllSockets.TryGetValue(socketId, out socketInformation))
            {
                socket = socketInformation.StreamSocket;
                socket.TransferOwnership(socketId);
                socket = null;
            }

            Debug.WriteLine("Tâche d'arrière plan démarrée");
        }
        catch (Exception exception)
        {
            Debug.WriteLine(exception.Message);
        }
    }
}

Не проще ли выполнить эти действия в файле App.xaml.cs при запуске OnLaunched? Можем ли мы вызвать функцию в конце OnLaunched?

1 Ответ

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

Проблема, с которой вы сталкиваетесь, заключается в том, что если вы проверяете, не было ли найдено значение:

if (!SocketActivityInformation.AllSockets.TryGetValue(socketId, out socketInformation))
{
    // Your code
}

Если это значение равно false, то значение для socketId не найденопоэтому socketInformation (который не был инициализирован) получит значение по умолчанию, равное null.Это причина проблемы.Вы должны изменить свой if, чтобы войти в блок кода, если вместо этого было найдено значение:

if (!SocketActivityInformation.AllSockets.TryGetValue(socketId, out socketInformation))
{
    // Your code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...