You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP进程外后台任务与NamedPipeServer通信出现管道破裂问题

UWP进程外后台任务中NamedPipe出现“管道破裂”异常问题

我在UWP平台实现了一个进程外后台任务,使用LibVLCSharp库下载HLS流(m3u/m3u8)。当前存在两个独立进程:应用主进程作为宿主创建NamedPipeServer,后台任务作为客户端创建NamedPipeClient并完成连接。但在管道读写操作时频繁触发Pipe is broken异常,且异常抛出时PipeServer.IsConnected属性为false。

创建PipeServer的代码

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

        streamServer = new StreamString(pipeServer);

        if (!isClientListening)
        {
            isClientListening = true;

            ListenClient();
        }
    });

创建并连接PipeClient的代码

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

    await pipeClient.ConnectAsync();

    streamClient = new StreamString(pipeClient);
}

触发“管道破裂”的操作步骤

  • 点击按钮:在按钮点击处理方法中,先创建PipeServer、注册后台任务,之后创建并连接PipeClient;
  • PipeClient开始等待PipeServer完成数据写入。

PipeClient读取数据的代码

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

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

return tasks;

PipeServer写入数据的代码

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

问题复现情况

该问题无法在所有机器上复现:两台系统版本均为Win10 19045.4870的测试机,一台未出现问题,另一台则触发异常,说明问题与Windows版本无关。

注:我使用的NamedPipe相关实现基于微软官方文档中的示例,包含本文用到的StreamString类。


内容的提问来源于stack exchange,提问作者Denys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:10:02