瀏覽代碼

Reduce usage of GetAwaiter().GetResult()

Bond_009 2 年之前
父節點
當前提交
d8ec3a5470

+ 14 - 10
Emby.Server.Implementations/Channels/ChannelManager.cs

@@ -157,16 +157,16 @@ namespace Emby.Server.Implementations.Channels
         }
 
         /// <inheritdoc />
-        public QueryResult<Channel> GetChannelsInternal(ChannelQuery query)
+        public async Task<QueryResult<Channel>> GetChannelsInternalAsync(ChannelQuery query)
         {
             var user = query.UserId.Equals(default)
                 ? null
                 : _userManager.GetUserById(query.UserId);
 
-            var channels = GetAllChannels()
-                .Select(GetChannelEntity)
+            var channels = await GetAllChannelEntitiesAsync()
                 .OrderBy(i => i.SortName)
-                .ToList();
+                .ToListAsync()
+                .ConfigureAwait(false);
 
             if (query.IsRecordingsFolder.HasValue)
             {
@@ -226,6 +226,7 @@ namespace Emby.Server.Implementations.Channels
 
             if (user is not null)
             {
+                var userId = user.Id.ToString("N", CultureInfo.InvariantCulture);
                 channels = channels.Where(i =>
                 {
                     if (!i.IsVisible(user))
@@ -235,7 +236,7 @@ namespace Emby.Server.Implementations.Channels
 
                     try
                     {
-                        return GetChannelProvider(i).IsEnabledFor(user.Id.ToString("N", CultureInfo.InvariantCulture));
+                        return GetChannelProvider(i).IsEnabledFor(userId);
                     }
                     catch
                     {
@@ -258,7 +259,7 @@ namespace Emby.Server.Implementations.Channels
             {
                 foreach (var item in all)
                 {
-                    RefreshLatestChannelItems(GetChannelProvider(item), CancellationToken.None).GetAwaiter().GetResult();
+                    await RefreshLatestChannelItems(GetChannelProvider(item), CancellationToken.None).ConfigureAwait(false);
                 }
             }
 
@@ -269,13 +270,13 @@ namespace Emby.Server.Implementations.Channels
         }
 
         /// <inheritdoc />
-        public QueryResult<BaseItemDto> GetChannels(ChannelQuery query)
+        public async Task<QueryResult<BaseItemDto>> GetChannelsAsync(ChannelQuery query)
         {
             var user = query.UserId.Equals(default)
                 ? null
                 : _userManager.GetUserById(query.UserId);
 
-            var internalResult = GetChannelsInternal(query);
+            var internalResult = await GetChannelsInternalAsync(query).ConfigureAwait(false);
 
             var dtoOptions = new DtoOptions();
 
@@ -327,9 +328,12 @@ namespace Emby.Server.Implementations.Channels
             progress.Report(100);
         }
 
-        private Channel GetChannelEntity(IChannel channel)
+        private async IAsyncEnumerable<Channel> GetAllChannelEntitiesAsync()
         {
-            return GetChannel(GetInternalChannelId(channel.Name)) ?? GetChannel(channel, CancellationToken.None).GetAwaiter().GetResult();
+            foreach (IChannel channel in GetAllChannels())
+            {
+                yield return GetChannel(GetInternalChannelId(channel.Name)) ?? await GetChannel(channel, CancellationToken.None).ConfigureAwait(false);
+            }
         }
 
         private MediaSourceInfo[] GetSavedMediaSources(BaseItem item)

+ 13 - 5
Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs

@@ -276,25 +276,31 @@ namespace Emby.Server.Implementations.EntryPoints
         /// Libraries the update timer callback.
         /// </summary>
         /// <param name="state">The state.</param>
-        private void LibraryUpdateTimerCallback(object state)
+        private async void LibraryUpdateTimerCallback(object state)
         {
+            List<Folder> foldersAddedTo;
+            List<Folder> foldersRemovedFrom;
+            List<BaseItem> itemsUpdated;
+            List<BaseItem> itemsAdded;
+            List<BaseItem> itemsRemoved;
             lock (_libraryChangedSyncLock)
             {
                 // Remove dupes in case some were saved multiple times
-                var foldersAddedTo = _foldersAddedTo
+                foldersAddedTo = _foldersAddedTo
                                         .DistinctBy(x => x.Id)
                                         .ToList();
 
-                var foldersRemovedFrom = _foldersRemovedFrom
+                foldersRemovedFrom = _foldersRemovedFrom
                                             .DistinctBy(x => x.Id)
                                             .ToList();
 
-                var itemsUpdated = _itemsUpdated
+                itemsUpdated = _itemsUpdated
                                     .Where(i => !_itemsAdded.Contains(i))
                                     .DistinctBy(x => x.Id)
                                     .ToList();
 
-                SendChangeNotifications(_itemsAdded.ToList(), itemsUpdated, _itemsRemoved.ToList(), foldersAddedTo, foldersRemovedFrom, CancellationToken.None).GetAwaiter().GetResult();
+                itemsAdded = _itemsAdded.ToList();
+                itemsRemoved = _itemsRemoved.ToList();
 
                 if (LibraryUpdateTimer is not null)
                 {
@@ -308,6 +314,8 @@ namespace Emby.Server.Implementations.EntryPoints
                 _foldersAddedTo.Clear();
                 _foldersRemovedFrom.Clear();
             }
+
+            await SendChangeNotifications(itemsAdded, itemsUpdated, itemsRemoved, foldersAddedTo, foldersRemovedFrom, CancellationToken.None).ConfigureAwait(false);
         }
 
         /// <summary>

+ 7 - 6
Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs

@@ -87,29 +87,30 @@ namespace Emby.Server.Implementations.EntryPoints
             }
         }
 
-        private void UpdateTimerCallback(object? state)
+        private async void UpdateTimerCallback(object? state)
         {
+            List<KeyValuePair<Guid, List<BaseItem>>> changes;
             lock (_syncLock)
             {
                 // Remove dupes in case some were saved multiple times
-                var changes = _changedItems.ToList();
+                changes = _changedItems.ToList();
                 _changedItems.Clear();
 
-                SendNotifications(changes, CancellationToken.None).GetAwaiter().GetResult();
-
                 if (_updateTimer is not null)
                 {
                     _updateTimer.Dispose();
                     _updateTimer = null;
                 }
             }
+
+            await SendNotifications(changes, CancellationToken.None).ConfigureAwait(false);
         }
 
         private async Task SendNotifications(List<KeyValuePair<Guid, List<BaseItem>>> changes, CancellationToken cancellationToken)
         {
-            foreach (var pair in changes)
+            foreach ((var key, var value) in changes)
             {
-                await SendNotifications(pair.Key, pair.Value, cancellationToken).ConfigureAwait(false);
+                await SendNotifications(key, value, cancellationToken).ConfigureAwait(false);
             }
         }
 

+ 2 - 2
Emby.Server.Implementations/Library/UserViewManager.cs

@@ -111,10 +111,10 @@ namespace Emby.Server.Implementations.Library
 
             if (query.IncludeExternalContent)
             {
-                var channelResult = _channelManager.GetChannelsInternal(new ChannelQuery
+                var channelResult = _channelManager.GetChannelsInternalAsync(new ChannelQuery
                 {
                     UserId = query.UserId
-                });
+                }).GetAwaiter().GetResult();
 
                 var channels = channelResult.Items;
 

+ 16 - 16
Emby.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -1312,20 +1312,19 @@ namespace Emby.Server.Implementations.LiveTv
             return 7;
         }
 
-        private QueryResult<BaseItem> GetEmbyRecordings(RecordingQuery query, DtoOptions dtoOptions, User user)
+        private async Task<QueryResult<BaseItem>> GetEmbyRecordingsAsync(RecordingQuery query, DtoOptions dtoOptions, User user)
         {
             if (user is null)
             {
                 return new QueryResult<BaseItem>();
             }
 
-            var folderIds = GetRecordingFolders(user, true)
-                .Select(i => i.Id)
-                .ToList();
+            var folders = await GetRecordingFoldersAsync(user, true).ConfigureAwait(false);
+            var folderIds = Array.ConvertAll(folders, x => x.Id);
 
             var excludeItemTypes = new List<BaseItemKind>();
 
-            if (folderIds.Count == 0)
+            if (folderIds.Length == 0)
             {
                 return new QueryResult<BaseItem>();
             }
@@ -1392,7 +1391,7 @@ namespace Emby.Server.Implementations.LiveTv
             {
                 MediaTypes = new[] { MediaType.Video },
                 Recursive = true,
-                AncestorIds = folderIds.ToArray(),
+                AncestorIds = folderIds,
                 IsFolder = false,
                 IsVirtualItem = false,
                 Limit = limit,
@@ -1528,7 +1527,7 @@ namespace Emby.Server.Implementations.LiveTv
             }
         }
 
-        public QueryResult<BaseItemDto> GetRecordings(RecordingQuery query, DtoOptions options)
+        public async Task<QueryResult<BaseItemDto>> GetRecordingsAsync(RecordingQuery query, DtoOptions options)
         {
             var user = query.UserId.Equals(default)
                 ? null
@@ -1536,7 +1535,7 @@ namespace Emby.Server.Implementations.LiveTv
 
             RemoveFields(options);
 
-            var internalResult = GetEmbyRecordings(query, options, user);
+            var internalResult = await GetEmbyRecordingsAsync(query, options, user).ConfigureAwait(false);
 
             var returnArray = _dtoService.GetBaseItemDtos(internalResult.Items, options, user);
 
@@ -2379,12 +2378,11 @@ namespace Emby.Server.Implementations.LiveTv
             return _tvDtoService.GetInternalProgramId(externalId);
         }
 
-        public List<BaseItem> GetRecordingFolders(User user)
-        {
-            return GetRecordingFolders(user, false);
-        }
+        /// <inheritdoc />
+        public Task<BaseItem[]> GetRecordingFoldersAsync(User user)
+            => GetRecordingFoldersAsync(user, false);
 
-        private List<BaseItem> GetRecordingFolders(User user, bool refreshChannels)
+        private async Task<BaseItem[]> GetRecordingFoldersAsync(User user, bool refreshChannels)
         {
             var folders = EmbyTV.EmbyTV.Current.GetRecordingFolders()
                 .SelectMany(i => i.Locations)
@@ -2396,14 +2394,16 @@ namespace Emby.Server.Implementations.LiveTv
                 .OrderBy(i => i.SortName)
                 .ToList();
 
-            folders.AddRange(_channelManager.GetChannelsInternal(new MediaBrowser.Model.Channels.ChannelQuery
+            var channels = await _channelManager.GetChannelsInternalAsync(new MediaBrowser.Model.Channels.ChannelQuery
             {
                 UserId = user.Id,
                 IsRecordingsFolder = true,
                 RefreshLatestChannelItems = refreshChannels
-            }).Items);
+            }).ConfigureAwait(false);
+
+            folders.AddRange(channels.Items);
 
-            return folders.Cast<BaseItem>().ToList();
+            return folders.Cast<BaseItem>().ToArray();
         }
     }
 }

+ 3 - 3
Jellyfin.Api/Controllers/ChannelsController.cs

@@ -52,7 +52,7 @@ public class ChannelsController : BaseJellyfinApiController
     /// <returns>An <see cref="OkResult"/> containing the channels.</returns>
     [HttpGet]
     [ProducesResponseType(StatusCodes.Status200OK)]
-    public ActionResult<QueryResult<BaseItemDto>> GetChannels(
+    public async Task<ActionResult<QueryResult<BaseItemDto>>> GetChannels(
         [FromQuery] Guid? userId,
         [FromQuery] int? startIndex,
         [FromQuery] int? limit,
@@ -61,7 +61,7 @@ public class ChannelsController : BaseJellyfinApiController
         [FromQuery] bool? isFavorite)
     {
         userId = RequestHelpers.GetUserId(User, userId);
-        return _channelManager.GetChannels(new ChannelQuery
+        return await _channelManager.GetChannelsAsync(new ChannelQuery
         {
             Limit = limit,
             StartIndex = startIndex,
@@ -69,7 +69,7 @@ public class ChannelsController : BaseJellyfinApiController
             SupportsLatestItems = supportsLatestItems,
             SupportsMediaDeletion = supportsMediaDeletion,
             IsFavorite = isFavorite
-        });
+        }).ConfigureAwait(false);
     }
 
     /// <summary>

+ 5 - 5
Jellyfin.Api/Controllers/LiveTvController.cs

@@ -252,7 +252,7 @@ public class LiveTvController : BaseJellyfinApiController
     [HttpGet("Recordings")]
     [ProducesResponseType(StatusCodes.Status200OK)]
     [Authorize(Policy = Policies.LiveTvAccess)]
-    public ActionResult<QueryResult<BaseItemDto>> GetRecordings(
+    public async Task<ActionResult<QueryResult<BaseItemDto>>> GetRecordings(
         [FromQuery] string? channelId,
         [FromQuery] Guid? userId,
         [FromQuery] int? startIndex,
@@ -278,7 +278,7 @@ public class LiveTvController : BaseJellyfinApiController
             .AddClientFields(User)
             .AddAdditionalDtoOptions(enableImages, enableUserData, imageTypeLimit, enableImageTypes);
 
-        return _liveTvManager.GetRecordings(
+        return await _liveTvManager.GetRecordingsAsync(
             new RecordingQuery
             {
                 ChannelId = channelId,
@@ -299,7 +299,7 @@ public class LiveTvController : BaseJellyfinApiController
                 ImageTypeLimit = imageTypeLimit,
                 EnableImages = enableImages
             },
-            dtoOptions);
+            dtoOptions).ConfigureAwait(false);
     }
 
     /// <summary>
@@ -383,13 +383,13 @@ public class LiveTvController : BaseJellyfinApiController
     [HttpGet("Recordings/Folders")]
     [ProducesResponseType(StatusCodes.Status200OK)]
     [Authorize(Policy = Policies.LiveTvAccess)]
-    public ActionResult<QueryResult<BaseItemDto>> GetRecordingFolders([FromQuery] Guid? userId)
+    public async Task<ActionResult<QueryResult<BaseItemDto>>> GetRecordingFolders([FromQuery] Guid? userId)
     {
         userId = RequestHelpers.GetUserId(User, userId);
         var user = userId.Value.Equals(default)
             ? null
             : _userManager.GetUserById(userId.Value);
-        var folders = _liveTvManager.GetRecordingFolders(user);
+        var folders = await _liveTvManager.GetRecordingFoldersAsync(user).ConfigureAwait(false);
 
         var returnArray = _dtoService.GetBaseItemDtos(folders, new DtoOptions(), user);
 

+ 2 - 2
Jellyfin.Api/WebSocketListeners/ActivityLogWebSocketListener.cs

@@ -56,8 +56,8 @@ public class ActivityLogWebSocketListener : BasePeriodicWebSocketListener<Activi
         base.Dispose(dispose);
     }
 
-    private void OnEntryCreated(object? sender, GenericEventArgs<ActivityLogEntry> e)
+    private async void OnEntryCreated(object? sender, GenericEventArgs<ActivityLogEntry> e)
     {
-        SendData(true).GetAwaiter().GetResult();
+        await SendData(true).ConfigureAwait(false);
     }
 }

+ 2 - 2
MediaBrowser.Controller/Channels/IChannelManager.cs

@@ -46,14 +46,14 @@ namespace MediaBrowser.Controller.Channels
         /// </summary>
         /// <param name="query">The query.</param>
         /// <returns>The channels.</returns>
-        QueryResult<Channel> GetChannelsInternal(ChannelQuery query);
+        Task<QueryResult<Channel>> GetChannelsInternalAsync(ChannelQuery query);
 
         /// <summary>
         /// Gets the channels.
         /// </summary>
         /// <param name="query">The query.</param>
         /// <returns>The channels.</returns>
-        QueryResult<BaseItemDto> GetChannels(ChannelQuery query);
+        Task<QueryResult<BaseItemDto>> GetChannelsAsync(ChannelQuery query);
 
         /// <summary>
         /// Gets the latest channel items.

+ 2 - 2
MediaBrowser.Controller/LiveTv/ILiveTvManager.cs

@@ -97,7 +97,7 @@ namespace MediaBrowser.Controller.LiveTv
         /// <param name="query">The query.</param>
         /// <param name="options">The options.</param>
         /// <returns>A recording.</returns>
-        QueryResult<BaseItemDto> GetRecordings(RecordingQuery query, DtoOptions options);
+        Task<QueryResult<BaseItemDto>> GetRecordingsAsync(RecordingQuery query, DtoOptions options);
 
         /// <summary>
         /// Gets the timers.
@@ -308,6 +308,6 @@ namespace MediaBrowser.Controller.LiveTv
 
         void AddInfoToRecordingDto(BaseItem item, BaseItemDto dto, ActiveRecordingInfo activeRecordingInfo, User user = null);
 
-        List<BaseItem> GetRecordingFolders(User user);
+        Task<BaseItem[]> GetRecordingFoldersAsync(User user);
     }
 }

+ 7 - 16
MediaBrowser.Model/Dlna/StreamBuilder.cs

@@ -44,32 +44,24 @@ namespace MediaBrowser.Model.Dlna
         {
             ValidateMediaOptions(options, false);
 
-            var mediaSources = new List<MediaSourceInfo>();
+            var streams = new List<StreamInfo>();
             foreach (var mediaSource in options.MediaSources)
             {
-                if (string.IsNullOrEmpty(options.MediaSourceId)
-                    || string.Equals(mediaSource.Id, options.MediaSourceId, StringComparison.OrdinalIgnoreCase))
+                if (!(string.IsNullOrEmpty(options.MediaSourceId)
+                    || string.Equals(mediaSource.Id, options.MediaSourceId, StringComparison.OrdinalIgnoreCase)))
                 {
-                    mediaSources.Add(mediaSource);
+                    continue;
                 }
-            }
 
-            var streams = new List<StreamInfo>();
-            foreach (var mediaSourceInfo in mediaSources)
-            {
-                StreamInfo? streamInfo = GetOptimalAudioStream(mediaSourceInfo, options);
+                StreamInfo? streamInfo = GetOptimalAudioStream(mediaSource, options);
                 if (streamInfo is not null)
                 {
+                    streamInfo.DeviceId = options.DeviceId;
+                    streamInfo.DeviceProfileId = options.Profile.Id;
                     streams.Add(streamInfo);
                 }
             }
 
-            foreach (var stream in streams)
-            {
-                stream.DeviceId = options.DeviceId;
-                stream.DeviceProfileId = options.Profile.Id;
-            }
-
             return GetOptimalStream(streams, options.GetMaxBitrate(true) ?? 0);
         }
 
@@ -399,7 +391,6 @@ namespace MediaBrowser.Model.Dlna
                 return (null, null, GetTranscodeReasonsFromDirectPlayProfile(item, null, audioStream, options.Profile.DirectPlayProfiles));
             }
 
-            var playMethods = new List<PlayMethod>();
             TranscodeReason transcodeReasons = 0;
 
             // The profile describes what the device supports

+ 1 - 1
MediaBrowser.Providers/Plugins/StudioImages/StudiosImageProvider.cs

@@ -53,7 +53,7 @@ namespace MediaBrowser.Providers.Plugins.StudioImages
         /// <inheritdoc />
         public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
         {
-            return new List<ImageType>
+            return new ImageType[]
             {
                 ImageType.Thumb
             };