Here I’ll talk about WaitFor extension method. This extension method used to run a method with finite number of retries if it failed to run at first time and/or in a finite time frame. It provides most of Action and Func delgates overloads.
1. Add reference to Cinchoo.Core.dll assembly
2. Namespace Cinchoo.Core
Sample 1:
Below are the list of overloads for Func<T> delegate, Cinchoo provides these overloads almost all the Func’s and Action’s.
public static TResult WaitFor(this Func func); public static TResult WaitFor(this Func func, int timeout); public static TResult WaitFor(this Func func, int timeout, int maxNoOfRetry); public static TResult WaitFor(this Func func, int timeout, int maxNoOfRetry, int sleepBetweenRetry);
Below sample shows you how to run a Func<T> delegate method using WaitFor() extension method.
class Program { static void Main(string[] args) { Func f1 = () => { System.Threading.Thread.Sleep(1); Console.WriteLine("Running method..."); return 1; }; Console.WriteLine("Output: {0}".FormatString(f1.WaitFor())); } }
When you run the above code, the output will be
Running method... Output: 1 Press any key to continue . . .
Sample 2:
In this example, I’ll show you the way of invoking a method with timeout (1000ms) parameter. It throws a timeout exception, as the method takes more time to execute than timeout (1000 ms) period.
class Program { static void Main(string[] args) { try { Func f1 = () => { System.Threading.Thread.Sleep(5000); Console.WriteLine("Running method..."); return 1; }; Console.WriteLine("Output: {0}".FormatString(f1.WaitFor(1000))); } catch (Exception ex) { Console.WriteLine("Error: {0}".FormatString(ex.Message)); } } }
When you run the above code, the output will be
Error: Timeout [1000 ms] elapsed prior to completion of the method [Target: , Metho d: Int32 b__0()]. Press any key to continue . . .
Sample 3:
In here, we will see how a method with an error is executed for number of times with one of the WaitFor overload.
static void Main(string[] args) { try { Func<int> f1 = () => { System.Threading.Thread.Sleep(10); throw new ApplicationException("Communication error."); }; Console.WriteLine("Output: {0}".FormatString(f1.WaitFor(Timeout.Infinite, 3))); } catch (Exception ex) { Console.WriteLine("Error: {0}".FormatString(ex.Message)); } }
When you run the above code, the output will be
Error: Exception(s) occurred : The method failed to execute after 3 retries.. [ System.ApplicationException: Communication error. at Cinchoo.Core.ChoWaitForTest.Program.<Main>b__0() in C:\Personal\Cinchoo.Fr amwork\Cinchoo.Core.Test\Cinchoo.Core.ChoWaitFor.Test\Program.cs:line 18 at Cinchoo.Core.ChoWaitFor.WaitFor[TResult](Func`1 func, Int32 timeout, Int32 maxNoOfRetry, Int32 sleepBetweenRetry) in C:\Personal\Cinchoo.Framwork\Cinchoo. Framework\Cinchoo.Core\WaitFor\ChoWaitFor.cs:line 148 ] [ System.ApplicationException: Communication error. at Cinchoo.Core.ChoWaitForTest.Program.<Main>b__0() in C:\Personal\Cinchoo.Fr amwork\Cinchoo.Core.Test\Cinchoo.Core.ChoWaitFor.Test\Program.cs:line 18 at Cinchoo.Core.ChoWaitFor.WaitFor[TResult](Func`1 func, Int32 timeout, Int32 maxNoOfRetry, Int32 sleepBetweenRetry) in C:\Personal\Cinchoo.Framwork\Cinchoo. Framework\Cinchoo.Core\WaitFor\ChoWaitFor.cs:line 148 ] [ System.ApplicationException: Communication error. at Cinchoo.Core.ChoWaitForTest.Program.<Main>b__0() in C:\Personal\Cinchoo.Fr amwork\Cinchoo.Core.Test\Cinchoo.Core.ChoWaitFor.Test\Program.cs:line 18 at Cinchoo.Core.ChoWaitFor.WaitFor[TResult](Func`1 func, Int32 timeout, Int32 maxNoOfRetry, Int32 sleepBetweenRetry) in C:\Personal\Cinchoo.Framwork\Cinchoo. Framework\Cinchoo.Core\WaitFor\ChoWaitFor.cs:line 148 ] Press any key to continue . . .
Happy coding!!!