Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.38 KB | None | 0 0
  1. using System;
  2. using System.Diagnostics;
  3. using System.Runtime.CompilerServices;
  4. using System.Threading.Tasks;
  5.  
  6. public class WithTcs
  7. {
  8. readonly TaskCompletionSource<bool> m_tcs = new TaskCompletionSource<bool>();
  9.  
  10. public async Task WhenAnyLocalTcsAsync(Task task)
  11. {
  12. var tcs = new TaskCompletionSource<bool>();
  13. await await Task.WhenAny(task, tcs.Task).ConfigureAwait(false);
  14. }
  15.  
  16. public async Task WhenAnyMemberTcsIndirectAsync(Task task)
  17. {
  18. await await Task.WhenAny(task, AwaitTcsTaskAsync(m_tcs)).ConfigureAwait(false);
  19. }
  20.  
  21. private async Task<TResult> AwaitTcsTaskAsync<TResult>(TaskCompletionSource<TResult> tcs)
  22. {
  23. return await tcs.Task.ConfigureAwait(false);
  24. }
  25.  
  26. public async Task WhenAnyMemberTcsDirectAsync(Task task)
  27. {
  28. await await Task.WhenAny(task, m_tcs.Task).ConfigureAwait(false);
  29. }
  30. }
  31.  
  32. class Program
  33. {
  34. static void Main(string[] args)
  35. {
  36. show_warning_if_debugger_attached();
  37.  
  38. MainAsync().GetAwaiter().GetResult();
  39.  
  40. show_warning_if_debugger_attached();
  41. Console.ReadLine();
  42. }
  43.  
  44. static async Task MainAsync()
  45. {
  46. const int n = 100000;
  47.  
  48. Console.WriteLine("Running Task.WhenAny tests ({0:#,0} iterations)", n);
  49. Console.WriteLine();
  50.  
  51. await WhenAnyLocalTcs(n).ConfigureAwait(false);
  52.  
  53. await Task.Delay(1000).ConfigureAwait(false);
  54.  
  55. await WhenAnyMemberTcsIndirect(n).ConfigureAwait(false);
  56.  
  57. await Task.Delay(1000).ConfigureAwait(false);
  58.  
  59. await WhenAnyMemberTcsDirect(n).ConfigureAwait(false);
  60. }
  61.  
  62. static Task WhenAnyLocalTcs(int n)
  63. {
  64. Func<WithTcs, Task, Task> function =
  65. (instance, task) => instance.WhenAnyLocalTcsAsync(task);
  66.  
  67. return RunTestAsync(n, function);
  68. }
  69.  
  70. static Task WhenAnyMemberTcsIndirect(int n)
  71. {
  72. Func<WithTcs, Task, Task> function =
  73. (instance, task) => instance.WhenAnyMemberTcsIndirectAsync(task);
  74.  
  75. return RunTestAsync(n, function);
  76. }
  77.  
  78. static Task WhenAnyMemberTcsDirect(int n)
  79. {
  80. Func<WithTcs, Task, Task> function =
  81. (instance, task) => instance.WhenAnyMemberTcsDirectAsync(task);
  82.  
  83. return RunTestAsync(n, function);
  84. }
  85.  
  86. static async Task RunTestAsync(int n, Func<WithTcs, Task, Task> function, [CallerMemberName] string name = "")
  87. {
  88. Console.WriteLine(name);
  89.  
  90. var tasks = new Task[n];
  91. var sw = new Stopwatch();
  92. var startBytes = GC.GetTotalMemory(true);
  93. sw.Start();
  94.  
  95. var instance = new WithTcs();
  96. var step = n / 78;
  97. for (int i = 0; i < n; i++)
  98. {
  99. var iTemp = i;
  100. Task primaryTask = Task.Run(() => { if (iTemp % step == 0) Console.Write("."); });
  101. tasks[i] = function(instance, primaryTask);
  102. }
  103.  
  104. await Task.WhenAll(tasks).ConfigureAwait(false);
  105. Console.WriteLine();
  106.  
  107. var endBytes = GC.GetTotalMemory(true);
  108. sw.Stop();
  109. GC.KeepAlive(instance);
  110. GC.KeepAlive(tasks);
  111.  
  112. Console.WriteLine(" Time: {0,7:#,0} ms, Memory: {1,10:#,0} bytes", sw.ElapsedMilliseconds, endBytes - startBytes);
  113. Console.WriteLine();
  114. }
  115.  
  116. static void show_warning_if_debugger_attached()
  117. {
  118. if (Debugger.IsAttached)
  119. Console.WriteLine("WARNING: running with the debugger attached may result in inaccurate resultsrn".ToUpper());
  120. }
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement