Фоновая задача вне процесса и NamedPipeServer в UWP

1
8

Я создал внепроцессную фоновую задачу, в которой я загружаю поток HLS (m3u/m3u8) с помощью библиотеки LibVLCSharp. Платформа — UWP

У меня есть два разных процесса: приложение и фоновая задача. Приложение — это хост-процесс, в котором я создаю NamedPipeServer. NamedClient создается и подключается в фоновой задаче. Поэтому фоновая задача — это клиентский процесс.

code создания PipeServer

code создания и подключения PipeClient

Я получаю исключение Pipe is broken в разных местах codeа. Когда PipeServer пытается записать данные в канал, а pipeClient пытается прочитать данные из канала. Когда выдается исключение Pipe is broken, свойство PipeServer.IsConnected равно false.

Пример действий, после которых Pipe is broken

Пример codeа, как я могу прочитать данные с помощью PipeClient

Пример codeа, как я могу записать данные с помощью PipeServer

Стек и исключение, которое я получаю

Я не могу воспроизвести проблемы на всех машинах. Я тестировал на Win10 19045.4870 на одной машине, и проблема не воспроизводится, но на другой машине с той же Win10 19045.4870 проблема воспроизводится, так что проблема не зависит от версий Windows.

Вся информация о NamedPipes, которую я использовал. Класс StreamString представлен в этой документации

            Task.Run(
                async () =>
                {
                    pipeServer = new NamedPipeServerStream(
                        PipeName,
                        PipeDirection.InOut,
                        1,
                        PipeTransmissionMode.Message,
                        PipeOptions.Asynchronous);

                    streamServer = new StreamString(pipeServer);

                    if (!isClientListening)
                    {
                        isClientListening = true;

                        ListenClient();
                    }
                });

        if (!pipeClient?.IsConnected ?? true)
        {
            pipeClient = new NamedPipeClientStream(
                ".",
                PipeName,
                PipeDirection.InOut,
                PipeOptions.Asynchronous);

            await pipeClient.ConnectAsync();

            streamClient = new StreamString(pipeClient);
        }
        List<RecordTask> tasks = null;
        if (pipeClient != null)
        {
            streamClient ??= new StreamString(pipeClient);

            var json = streamClient.ReadString();
            tasks = DeserializeJsonToRecordTaskList(json);
        }

        return tasks;
        if (pipeServer != null)
        {
            if (!pipeServer.IsConnected)
            {
                await pipeServer.WaitForConnectionAsync();
            }

            streamServer ??= new StreamString(pipeServer);
            var json = JsonConvert.SerializeObject(tasks);
            streamServer.WriteString(json);
        }
Pipe is broken.
   at System.IO.Pipes.NamedPipeServerStream.CheckConnectOperationsServer() + 0x77
   at System.IO.Pipes.NamedPipeServerStream.WaitForConnectionCoreAsync(CancellationToken) + 0x1e
   at System.IO.Pipes.NamedPipeServerStream.WaitForConnectionAsync(CancellationToken) + 0xc6
   at Iptv.Core.RecordProvider.<LoadServerRecordTasks>d__29.MoveNext() + 0x74
Pipe is broken.
   at System.IO.Pipes.NamedPipeServerStream.CheckConnectOperationsServer() + 0x77
   at System.IO.Pipes.NamedPipeServerStream.WaitForConnectionCoreAsync(CancellationToken) + 0x1e
   at System.IO.Pipes.NamedPipeServerStream.WaitForConnectionAsync(CancellationToken) + 0xc6
   at Iptv.Core.RecordProvider.<SaveServerRecordTasks>d__20.MoveNext() + 0x9b
в RecordProviderErrors.txt
Пантелеймон
Вопрос задан4 января 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.