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
相关产品推荐
相关产品推荐

