1+ // ***********************************************************************
2+ // Assembly : RzR.Shared.Extensions.TryToExecute
3+ // Author : RzR
4+ // Created On : 2024-12-05 19:05
5+ //
6+ // Last Modified By : RzR
7+ // Last Modified On : 2024-12-05 19:05
8+ // ***********************************************************************
9+ // <copyright file="TryToExecuteFuncFinallyAsync.cs" company="RzR SOFT & TECH">
10+ // Copyright © RzR. All rights reserved.
11+ // </copyright>
12+ //
13+ // <summary>
14+ // </summary>
15+ // ***********************************************************************
16+
17+ #region U S A G E S
18+
19+ using System ;
20+ using System . Diagnostics ;
21+ using System . Threading . Tasks ;
22+ using TryToExecute . Extensions ;
23+ using TryToExecute . Helpers ;
24+
25+ #if NETSTANDARD2_0_OR_GREATER
26+ using Microsoft . Extensions . Logging ;
27+ #endif
28+
29+ // ReSharper disable CheckNamespace
30+
31+ #endregion
32+
33+ namespace TryToExecute . CodeExec
34+ {
35+ /// <inheritdoc cref="CodeExec.TryCatchExecuteBase"/>
36+ public abstract partial class TryCatchExecuteBase
37+ {
38+ /// -------------------------------------------------------------------------------------------------
39+ /// <summary>
40+ /// Try to execute asynchronous.
41+ /// </summary>
42+ /// <typeparam name="TResult">Type of the result.</typeparam>
43+ /// <param name="execFunc">The execute function.</param>
44+ /// <param name="onFailureResult">The on failure result.</param>
45+ /// <param name="finallyExecFunc">The finally execute function.</param>
46+ /// <param name="forceCallGarbageCollector">
47+ /// (Optional) True to force call garbage collector.
48+ /// </param>
49+ /// <returns>
50+ /// A TResult.
51+ /// </returns>
52+ /// =================================================================================================
53+ protected virtual async Task < TResult > TryToExecuteAsync < TResult > (
54+ Func < Task < TResult > > execFunc ,
55+ TResult onFailureResult ,
56+ Func < Task < TResult > > finallyExecFunc ,
57+ bool forceCallGarbageCollector = false )
58+ {
59+ execFunc . ThrowIfArgNull ( nameof ( execFunc ) ) ;
60+ finallyExecFunc . ThrowIfArgNull ( nameof ( finallyExecFunc ) ) ;
61+
62+ try
63+ {
64+ return await execFunc . Invoke ( ) ;
65+ }
66+ catch ( Exception e )
67+ {
68+ #if DEBUG
69+ Debug . WriteLine ( e ) ;
70+ #if NETSTANDARD1_3_OR_GREATER
71+ Console . WriteLine ( e ) ;
72+ #endif
73+ #endif
74+
75+ return onFailureResult ;
76+ }
77+ finally
78+ {
79+ await finallyExecFunc . Invoke ( ) ;
80+
81+ if ( forceCallGarbageCollector . IsTrue ( ) )
82+ TryToExecuteAppHelper . ForceCallGC ( ) ;
83+ }
84+ }
85+
86+ #if NETSTANDARD2_0_OR_GREATER
87+ /// -------------------------------------------------------------------------------------------------
88+ /// <summary>
89+ /// Try to execute asynchronous.
90+ /// </summary>
91+ /// <typeparam name="TResult">Type of the result.</typeparam>
92+ /// <typeparam name="TLogger">Type of the logger.</typeparam>
93+ /// <param name="execFunc">The execute function.</param>
94+ /// <param name="onFailureResult">The on failure result.</param>
95+ /// <param name="exceptionLogger">The exception logger.</param>
96+ /// <param name="finallyExecFunc">The finally execute function.</param>
97+ /// <param name="forceCallGarbageCollector">
98+ /// (Optional) True to force call garbage collector.
99+ /// </param>
100+ /// <returns>
101+ /// A TResult.
102+ /// </returns>
103+ /// =================================================================================================
104+ protected virtual async Task < TResult > TryToExecuteAsync < TResult , TLogger > (
105+ Func < Task < TResult > > execFunc ,
106+ TResult onFailureResult ,
107+ ILogger < TLogger > exceptionLogger ,
108+ Func < Task < TResult > > finallyExecFunc ,
109+ bool forceCallGarbageCollector = false )
110+ {
111+ execFunc . ThrowIfArgNull ( nameof ( execFunc ) ) ;
112+ finallyExecFunc . ThrowIfArgNull ( nameof ( finallyExecFunc ) ) ;
113+ exceptionLogger . ThrowIfArgNull ( nameof ( exceptionLogger ) ) ;
114+
115+ try
116+ {
117+ return await execFunc . Invoke ( ) ;
118+ }
119+ catch ( Exception e )
120+ {
121+ #if DEBUG
122+ Debug . WriteLine ( e ) ;
123+ #if NETSTANDARD1_3_OR_GREATER
124+ Console . WriteLine ( e ) ;
125+ #endif
126+ #endif
127+ exceptionLogger . LogError ( e , DefaultMessageHelper . InternalErrorOnTryExecute ) ;
128+
129+ return onFailureResult ;
130+ }
131+ finally
132+ {
133+ await finallyExecFunc . Invoke ( ) ;
134+
135+ if ( forceCallGarbageCollector . IsTrue ( ) )
136+ TryToExecuteAppHelper . ForceCallGC ( ) ;
137+ }
138+ }
139+ #endif
140+
141+ /// -------------------------------------------------------------------------------------------------
142+ /// <summary>
143+ /// Try to execute asynchronous.
144+ /// </summary>
145+ /// <typeparam name="TResult">Type of the result.</typeparam>
146+ /// <param name="execFunc">The execute function.</param>
147+ /// <param name="onFailureResult">The on failure result.</param>
148+ /// <param name="finallyExecFunc">The finally execute function.</param>
149+ /// <param name="forceCallGarbageCollector">
150+ /// (Optional) True to force call garbage collector.
151+ /// </param>
152+ /// <returns>
153+ /// A TResult.
154+ /// </returns>
155+ /// =================================================================================================
156+ protected virtual async Task < TResult > TryToExecuteAsync < TResult > (
157+ Func < Task < TResult > > execFunc ,
158+ Func < TResult > onFailureResult ,
159+ Func < Task < TResult > > finallyExecFunc ,
160+ bool forceCallGarbageCollector = false )
161+ {
162+ execFunc . ThrowIfArgNull ( nameof ( execFunc ) ) ;
163+ onFailureResult . ThrowIfArgNull ( nameof ( onFailureResult ) ) ;
164+ finallyExecFunc . ThrowIfArgNull ( nameof ( finallyExecFunc ) ) ;
165+
166+ try
167+ {
168+ return await execFunc . Invoke ( ) ;
169+ }
170+ catch ( Exception e )
171+ {
172+ #if DEBUG
173+ Debug . WriteLine ( e ) ;
174+ #if NETSTANDARD1_3_OR_GREATER
175+ Console . WriteLine ( e ) ;
176+ #endif
177+ #endif
178+
179+ return onFailureResult . Invoke ( ) ;
180+ }
181+ finally
182+ {
183+ await finallyExecFunc . Invoke ( ) ;
184+
185+ if ( forceCallGarbageCollector . IsTrue ( ) )
186+ TryToExecuteAppHelper . ForceCallGC ( ) ;
187+ }
188+ }
189+
190+ #if NETSTANDARD2_0_OR_GREATER
191+ /// -------------------------------------------------------------------------------------------------
192+ /// <summary>
193+ /// Try to execute asynchronous.
194+ /// </summary>
195+ /// <typeparam name="TResult">Type of the result.</typeparam>
196+ /// <typeparam name="TLogger">Type of the logger.</typeparam>
197+ /// <param name="execFunc">The execute function.</param>
198+ /// <param name="onFailureResult">The on failure result.</param>
199+ /// <param name="exceptionLogger">The exception logger.</param>
200+ /// <param name="finallyExecFunc">The finally execute function.</param>
201+ /// <param name="forceCallGarbageCollector">
202+ /// (Optional) True to force call garbage collector.
203+ /// </param>
204+ /// <returns>
205+ /// A TResult.
206+ /// </returns>
207+ /// =================================================================================================
208+ protected virtual async Task < TResult > TryToExecuteAsync < TResult , TLogger > (
209+ Func < Task < TResult > > execFunc ,
210+ Func < TResult > onFailureResult ,
211+ ILogger < TLogger > exceptionLogger ,
212+ Func < Task < TResult > > finallyExecFunc ,
213+ bool forceCallGarbageCollector = false )
214+ {
215+ execFunc . ThrowIfArgNull ( nameof ( execFunc ) ) ;
216+ onFailureResult . ThrowIfArgNull ( nameof ( onFailureResult ) ) ;
217+ finallyExecFunc . ThrowIfArgNull ( nameof ( finallyExecFunc ) ) ;
218+ exceptionLogger . ThrowIfArgNull ( nameof ( exceptionLogger ) ) ;
219+
220+ try
221+ {
222+ return await execFunc . Invoke ( ) ;
223+ }
224+ catch ( Exception e )
225+ {
226+ #if DEBUG
227+ Debug . WriteLine ( e ) ;
228+ #if NETSTANDARD1_3_OR_GREATER
229+ Console . WriteLine ( e ) ;
230+ #endif
231+ #endif
232+ exceptionLogger . LogError ( e , DefaultMessageHelper . InternalErrorOnTryExecute ) ;
233+
234+ return onFailureResult . Invoke ( ) ;
235+ }
236+ finally
237+ {
238+ await finallyExecFunc . Invoke ( ) ;
239+
240+ if ( forceCallGarbageCollector . IsTrue ( ) )
241+ TryToExecuteAppHelper . ForceCallGC ( ) ;
242+ }
243+ }
244+ #endif
245+
246+ /// -------------------------------------------------------------------------------------------------
247+ /// <summary>
248+ /// Try to execute asynchronous.
249+ /// </summary>
250+ /// <typeparam name="TResult">Type of the result.</typeparam>
251+ /// <param name="execFunc">The execute function.</param>
252+ /// <param name="onFailureResult">The on failure result.</param>
253+ /// <param name="finallyExecFunc">The finally execute function.</param>
254+ /// <param name="forceCallGarbageCollector">
255+ /// (Optional) True to force call garbage collector.
256+ /// </param>
257+ /// <returns>
258+ /// A TResult.
259+ /// </returns>
260+ /// =================================================================================================
261+ protected virtual async Task < TResult > TryToExecuteAsync < TResult > (
262+ Func < Task < TResult > > execFunc ,
263+ Func < Task < TResult > > onFailureResult ,
264+ Func < Task < TResult > > finallyExecFunc ,
265+ bool forceCallGarbageCollector = false )
266+ {
267+ execFunc . ThrowIfArgNull ( nameof ( execFunc ) ) ;
268+ onFailureResult . ThrowIfArgNull ( nameof ( onFailureResult ) ) ;
269+ finallyExecFunc . ThrowIfArgNull ( nameof ( finallyExecFunc ) ) ;
270+
271+ try
272+ {
273+ return await execFunc . Invoke ( ) ;
274+ }
275+ catch ( Exception e )
276+ {
277+ #if DEBUG
278+ Debug . WriteLine ( e ) ;
279+ #if NETSTANDARD1_3_OR_GREATER
280+ Console . WriteLine ( e ) ;
281+ #endif
282+ #endif
283+
284+ return await onFailureResult . Invoke ( ) ;
285+ }
286+ finally
287+ {
288+ await finallyExecFunc . Invoke ( ) ;
289+
290+ if ( forceCallGarbageCollector . IsTrue ( ) )
291+ TryToExecuteAppHelper . ForceCallGC ( ) ;
292+ }
293+ }
294+
295+ #if NETSTANDARD2_0_OR_GREATER
296+ /// -------------------------------------------------------------------------------------------------
297+ /// <summary>
298+ /// Try to execute asynchronous.
299+ /// </summary>
300+ /// <typeparam name="TResult">Type of the result.</typeparam>
301+ /// <typeparam name="TLogger">Type of the logger.</typeparam>
302+ /// <param name="execFunc">The execute function.</param>
303+ /// <param name="onFailureResult">The on failure result.</param>
304+ /// <param name="exceptionLogger">The exception logger.</param>
305+ /// <param name="finallyExecFunc">The finally execute function.</param>
306+ /// <param name="forceCallGarbageCollector">
307+ /// (Optional) True to force call garbage collector.
308+ /// </param>
309+ /// <returns>
310+ /// A TResult.
311+ /// </returns>
312+ /// =================================================================================================
313+ protected virtual async Task < TResult > TryToExecuteAsync < TResult , TLogger > (
314+ Func < Task < TResult > > execFunc ,
315+ Func < Task < TResult > > onFailureResult ,
316+ ILogger < TLogger > exceptionLogger ,
317+ Func < Task < TResult > > finallyExecFunc ,
318+ bool forceCallGarbageCollector = false )
319+ {
320+ execFunc . ThrowIfArgNull ( nameof ( execFunc ) ) ;
321+ onFailureResult . ThrowIfArgNull ( nameof ( onFailureResult ) ) ;
322+ exceptionLogger . ThrowIfArgNull ( nameof ( exceptionLogger ) ) ;
323+ finallyExecFunc . ThrowIfArgNull ( nameof ( finallyExecFunc ) ) ;
324+
325+ try
326+ {
327+ return await execFunc . Invoke ( ) ;
328+ }
329+ catch ( Exception e )
330+ {
331+ #if DEBUG
332+ Debug . WriteLine ( e ) ;
333+ #if NETSTANDARD1_3_OR_GREATER
334+ Console . WriteLine ( e ) ;
335+ #endif
336+ #endif
337+ exceptionLogger . LogError ( e , DefaultMessageHelper . InternalErrorOnTryExecute ) ;
338+
339+ return await onFailureResult . Invoke ( ) ;
340+ }
341+ finally
342+ {
343+ await finallyExecFunc . Invoke ( ) ;
344+
345+ if ( forceCallGarbageCollector . IsTrue ( ) )
346+ TryToExecuteAppHelper . ForceCallGC ( ) ;
347+ }
348+ }
349+ #endif
350+ }
351+ }
0 commit comments