Я разрабатываю ЧМИ в рамках 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?