From 2f3abd800b554a92c08df28904e8d5a50312d547 Mon Sep 17 00:00:00 2001 From: Loretta Date: Mon, 24 Jun 2024 07:07:57 +0200 Subject: [PATCH] improvements, fixes, etc... --- .../Services/AcSignalRClientBase.cs | 23 +++++++------- .../Services/AcSignalRDataSource.cs | 30 ++++++++++++------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/AyCode.Blazor.Components/Services/AcSignalRClientBase.cs b/AyCode.Blazor.Components/Services/AcSignalRClientBase.cs index c084341..d2f6189 100644 --- a/AyCode.Blazor.Components/Services/AcSignalRClientBase.cs +++ b/AyCode.Blazor.Components/Services/AcSignalRClientBase.cs @@ -72,27 +72,28 @@ namespace AyCode.Blazor.Components.Services public virtual Task SendMessageToServerAsync(int messageTag) => SendMessageToServerAsync(messageTag, null, AcDomain.NextUniqueInt32); - public virtual async Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, int? requestId) + public virtual Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, int? requestId) { Logger.DebugConditional($"Client SendMessageToServerAsync; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};"); - await StartConnection(); - - var msgp = message?.ToMessagePack(ContractlessStandardResolver.Options); - HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnReceiveMessage), messageTag, msgp, requestId).Forget(); + return StartConnection().ContinueWith(x => + { + var msgp = message?.ToMessagePack(ContractlessStandardResolver.Options); + return HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnReceiveMessage), messageTag, msgp, requestId); + }); } #region CRUD public virtual Task GetByIdAsync(int messageTag, params Guid[] ids) where TResponseData : class => SendMessageToServerAsync(messageTag, new SignalPostJsonDataMessage(new IdMessage(ids)), AcDomain.NextUniqueInt32); - public virtual Task GetByIdAsync(int messageTag, Action> responseCallback, params Guid[] ids) + public virtual Task GetByIdAsync(int messageTag, Func, Task> responseCallback, params Guid[] ids) => SendMessageToServerAsync(messageTag, new SignalPostJsonDataMessage(new IdMessage(ids)), responseCallback); public virtual Task GetAllAsync(int messageTag) where TResponseData : class => SendMessageToServerAsync(messageTag); - public virtual Task GetAllAsync(int messageTag, Action> responseCallback) + public virtual Task GetAllAsync(int messageTag, Func, Task> responseCallback) => SendMessageToServerAsync(messageTag, null, responseCallback); - public virtual Task GetAllAsync(int messageTag, Action> responseCallback, params Guid[]? contextIds) + public virtual Task GetAllAsync(int messageTag, Func, Task> responseCallback, params Guid[]? contextIds) => SendMessageToServerAsync(messageTag, (contextIds == null || contextIds.Length == 0 ? null : new SignalPostJsonDataMessage(new IdMessage(contextIds))), responseCallback); public virtual Task GetAllAsync(int messageTag, params Guid[]? contextIds) where TResponseData : class @@ -100,7 +101,7 @@ namespace AyCode.Blazor.Components.Services public virtual Task PostDataAsync(int messageTag, TPostData postData) where TPostData : class => SendMessageToServerAsync(messageTag, new SignalPostJsonDataMessage(postData), AcDomain.NextUniqueInt32); - public virtual Task PostDataAsync(int messageTag, TPostData postData, Action> responseCallback) where TPostData : class + public virtual Task PostDataAsync(int messageTag, TPostData postData, Func, Task> responseCallback) where TPostData : class => SendMessageToServerAsync(messageTag, new SignalPostJsonDataMessage(postData), responseCallback); #endregion CRUD @@ -146,10 +147,10 @@ namespace AyCode.Blazor.Components.Services return default; } - public virtual Task SendMessageToServerAsync(int messageTag, Action> responseCallback) + public virtual Task SendMessageToServerAsync(int messageTag, Func, Task> responseCallback) => SendMessageToServerAsync(messageTag, null, responseCallback); - public virtual Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, Action> responseCallback) + public virtual Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, Func, Task> responseCallback) { if (messageTag == 0) Logger.Error($"SendMessageToServerAsync; messageTag == 0"); diff --git a/AyCode.Blazor.Components/Services/AcSignalRDataSource.cs b/AyCode.Blazor.Components/Services/AcSignalRDataSource.cs index 819765f..3eab037 100644 --- a/AyCode.Blazor.Components/Services/AcSignalRDataSource.cs +++ b/AyCode.Blazor.Components/Services/AcSignalRDataSource.cs @@ -138,7 +138,7 @@ namespace AyCode.Blazor.Components.Services if (result.Status != SignalResponseStatus.Success || result.ResponseData == null) throw new NullReferenceException($"LoadDataSourceAsync; result.Status != SignalResponseStatus.Success || result.ResponseData == null; Status: {SignalResponseStatus.Success}"); - LoadDataSource(result.ResponseData).Forget(); + return LoadDataSource(result.ResponseData); }, ContextIds); } @@ -687,17 +687,23 @@ namespace AyCode.Blazor.Components.Services protected Task SaveTrackingItemUnsafeAsync(TrackingItem trackingItem) => SaveItemUnsafeAsync(trackingItem.CurrentValue, trackingItem.TrackingState); - protected async Task SaveItemUnsafe(T item, TrackingState trackingState) + protected Task SaveItemUnsafe(T item, TrackingState trackingState) { var messageTag = SignalRCrudTags.GetMessageTagByTrackingState(trackingState); if (messageTag == AcSignalRTags.None) throw new ArgumentException($"SaveItemUnsafe; messageTag == SignalRTags.None"); - var result = await SignalRClient.PostDataAsync(messageTag, item); - if (result == null) throw new NullReferenceException($"SaveItemUnsafe; result == null"); + return SignalRClient.PostDataAsync(messageTag, item).ContinueWith(x => + { + if (x.Result == null) + { + if (TryRollbackItem(item.Id, out _)) return item; - await ProcessSavedResponseItem(result, trackingState); + throw new NullReferenceException($"SaveItemUnsafe; result == null"); + } - return result; + ProcessSavedResponseItem(x.Result, trackingState); + return x.Result; + }); } protected Task SaveItemUnsafeAsync(T item, TrackingState trackingState) @@ -713,12 +719,12 @@ namespace AyCode.Blazor.Components.Services { if (response.Status != SignalResponseStatus.Success || response.ResponseData == null) { - if (TryRollbackItem(item.Id, out _)) return; + if (TryRollbackItem(item.Id, out _)) return Task.CompletedTask; throw new NullReferenceException($"SaveItemUnsafeAsync; result.Status != SignalResponseStatus.Success || result.ResponseData == null; Status: {SignalResponseStatus.Success}"); } - ProcessSavedResponseItem(response.ResponseData, trackingState).Forget(); + return ProcessSavedResponseItem(response.ResponseData, trackingState); } finally { @@ -727,9 +733,9 @@ namespace AyCode.Blazor.Components.Services }); } - private async Task ProcessSavedResponseItem(T? resultItem, TrackingState trackingState) + private Task ProcessSavedResponseItem(T? resultItem, TrackingState trackingState) { - if (resultItem == null) return; + if (resultItem == null) return Task.CompletedTask; if (TryGetTrackingItem(resultItem.Id, out var trackingItem)) TrackingItems.Remove(trackingItem); @@ -738,7 +744,9 @@ namespace AyCode.Blazor.Components.Services InnerList[index] = resultItem; var eventArgs = new ItemChangedEventArgs(resultItem, trackingState); - if (OnDataSourceItemChanged != null) await OnDataSourceItemChanged.Invoke(eventArgs); + if (OnDataSourceItemChanged != null) return OnDataSourceItemChanged.Invoke(eventArgs); + + return Task.CompletedTask; } protected void RollbackItemUnsafe(TrackingItem trackingItem)