BradleyUffner

TaskCompletionSource demo

Nov 15th, 2021
1,158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.71 KB | None | 0 0
  1. async Task Main()
  2. {
  3.     var service = new RandomNumberService();
  4.  
  5.     Console.WriteLine("Requesting number via event...");
  6.     service.RandomNumberProduced += RandomNumberProduced;
  7.     service.RequestRandomNumber();
  8.     Console.WriteLine("Press any key after you get your number");
  9.     Console.ReadLine();
  10.     service.RandomNumberProduced -= RandomNumberProduced;
  11.  
  12.  
  13.  
  14.     Console.WriteLine("Awaiting random number");
  15.     var helper = new RandomHelper(service);
  16.     var result = await helper.RequestRandomNumberAsyc();
  17.     Console.WriteLine(result);
  18. }
  19.  
  20. public void RandomNumberProduced(object sender, RandomNumberProducedEventArgs e)
  21. {
  22.     Console.WriteLine(e.Number.ToString());
  23. }
  24.  
  25. public class RandomHelper
  26. {
  27.     private RandomNumberService _service;
  28.  
  29.     public RandomHelper(RandomNumberService service)
  30.     {
  31.         _service = service;
  32.     }
  33.  
  34.     public Task<int> RequestRandomNumberAsyc()
  35.     {
  36.         var tcs = new TaskCompletionSource<int>();
  37.         _service.RandomNumberProduced += RandomNumberProduced;
  38.  
  39.         _service.RequestRandomNumber();
  40.         return tcs.Task;
  41.  
  42.         void RandomNumberProduced(object sender, RandomNumberProducedEventArgs e)
  43.         {
  44.             _service.RandomNumberProduced -= RandomNumberProduced;
  45.             tcs.SetResult(e.Number);
  46.         }
  47.     }
  48. }
  49.  
  50. // You can define other methods, fields, classes and namespaces here
  51.  
  52. public class RandomNumberService
  53. {
  54.     private Random _rnd = new Random();
  55.  
  56.     public event EventHandler<RandomNumberProducedEventArgs>? RandomNumberProduced;
  57.  
  58.     public void RequestRandomNumber()
  59.     {
  60.         Task.Run(() =>
  61.         {
  62.             Thread.Sleep(5000);
  63.             RandomNumberProduced?.Invoke(this, new RandomNumberProducedEventArgs { Number = _rnd.Next() });
  64.         });
  65.     }
  66.  
  67. }
  68.  
  69. public class RandomNumberProducedEventArgs : EventArgs
  70. {
  71.     public int Number { get; set; }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment