瀏覽代碼

Merge pull request #6866 from Bond-009/timeout

Cody Robibero 3 年之前
父節點
當前提交
54d24ddeaf

+ 18 - 30
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs

@@ -165,7 +165,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
                 {
                     await CopyTo(udpClient, TempFilePath, openTaskCompletionSource, cancellationToken).ConfigureAwait(false);
                 }
-                catch (OperationCanceledException ex)
+                catch (Exception ex) when (ex is OperationCanceledException || ex is TimeoutException)
                 {
                     Logger.LogInformation("HDHR UDP stream cancelled or timed out from {0}", remoteAddress);
                     openTaskCompletionSource.TrySetException(ex);
@@ -191,36 +191,24 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
                 while (true)
                 {
                     cancellationToken.ThrowIfCancellationRequested();
-                    using (var timeOutSource = new CancellationTokenSource())
-                    using (var linkedSource = CancellationTokenSource.CreateLinkedTokenSource(
-                        cancellationToken,
-                        timeOutSource.Token))
+                    var res = await udpClient.ReceiveAsync(cancellationToken)
+                        .AsTask()
+                        .WaitAsync(TimeSpan.FromMilliseconds(30000), CancellationToken.None)
+                        .ConfigureAwait(false);
+                    var buffer = res.Buffer;
+
+                    var read = buffer.Length - RtpHeaderBytes;
+
+                    if (read > 0)
+                    {
+                        await fileStream.WriteAsync(buffer.AsMemory(RtpHeaderBytes, read), cancellationToken).ConfigureAwait(false);
+                    }
+
+                    if (!resolved)
                     {
-                        var resTask = udpClient.ReceiveAsync(linkedSource.Token).AsTask();
-                        if (await Task.WhenAny(resTask, Task.Delay(30000, linkedSource.Token)).ConfigureAwait(false) != resTask)
-                        {
-                            resTask.Dispose();
-                            break;
-                        }
-
-                        // We don't want all these delay tasks to keep running
-                        timeOutSource.Cancel();
-                        var res = await resTask.ConfigureAwait(false);
-                        var buffer = res.Buffer;
-
-                        var read = buffer.Length - RtpHeaderBytes;
-
-                        if (read > 0)
-                        {
-                            await fileStream.WriteAsync(buffer.AsMemory(RtpHeaderBytes, read), linkedSource.Token).ConfigureAwait(false);
-                        }
-
-                        if (!resolved)
-                        {
-                            resolved = true;
-                            DateOpened = DateTime.UtcNow;
-                            openTaskCompletionSource.TrySetResult(true);
-                        }
+                        resolved = true;
+                        DateOpened = DateTime.UtcNow;
+                        openTaskCompletionSource.TrySetResult(true);
                     }
                 }
             }

+ 1 - 11
Emby.Server.Implementations/Udp/UdpServer.cs

@@ -97,21 +97,11 @@ namespace Emby.Server.Implementations.Udp
 
         private async Task BeginReceiveAsync(CancellationToken cancellationToken)
         {
-            var infiniteTask = Task.Delay(-1, cancellationToken);
             while (!cancellationToken.IsCancellationRequested)
             {
                 try
                 {
-                    var task = _udpSocket.ReceiveFromAsync(_receiveBuffer, SocketFlags.None, _endpoint);
-                    await Task.WhenAny(task, infiniteTask).ConfigureAwait(false);
-
-                    if (!task.IsCompleted)
-                    {
-                        return;
-                    }
-
-                    var result = task.Result;
-
+                    var result = await _udpSocket.ReceiveFromAsync(_receiveBuffer, SocketFlags.None, _endpoint, cancellationToken).ConfigureAwait(false);
                     var text = Encoding.UTF8.GetString(_receiveBuffer, 0, result.ReceivedBytes);
                     if (text.Contains("who is JellyfinServer?", StringComparison.OrdinalIgnoreCase))
                     {