Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Diagnostics;
- using System.Runtime.CompilerServices;
- using System.Threading.Tasks;
- public class WithTcs
- {
- readonly TaskCompletionSource<bool> m_tcs = new TaskCompletionSource<bool>();
- public async Task WhenAnyLocalTcsAsync(Task task)
- {
- var tcs = new TaskCompletionSource<bool>();
- await await Task.WhenAny(task, tcs.Task).ConfigureAwait(false);
- }
- public async Task WhenAnyMemberTcsIndirectAsync(Task task)
- {
- await await Task.WhenAny(task, AwaitTcsTaskAsync(m_tcs)).ConfigureAwait(false);
- }
- private async Task<TResult> AwaitTcsTaskAsync<TResult>(TaskCompletionSource<TResult> tcs)
- {
- return await tcs.Task.ConfigureAwait(false);
- }
- public async Task WhenAnyMemberTcsDirectAsync(Task task)
- {
- await await Task.WhenAny(task, m_tcs.Task).ConfigureAwait(false);
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- show_warning_if_debugger_attached();
- MainAsync().GetAwaiter().GetResult();
- show_warning_if_debugger_attached();
- Console.ReadLine();
- }
- static async Task MainAsync()
- {
- const int n = 100000;
- Console.WriteLine("Running Task.WhenAny tests ({0:#,0} iterations)", n);
- Console.WriteLine();
- await WhenAnyLocalTcs(n).ConfigureAwait(false);
- await Task.Delay(1000).ConfigureAwait(false);
- await WhenAnyMemberTcsIndirect(n).ConfigureAwait(false);
- await Task.Delay(1000).ConfigureAwait(false);
- await WhenAnyMemberTcsDirect(n).ConfigureAwait(false);
- }
- static Task WhenAnyLocalTcs(int n)
- {
- Func<WithTcs, Task, Task> function =
- (instance, task) => instance.WhenAnyLocalTcsAsync(task);
- return RunTestAsync(n, function);
- }
- static Task WhenAnyMemberTcsIndirect(int n)
- {
- Func<WithTcs, Task, Task> function =
- (instance, task) => instance.WhenAnyMemberTcsIndirectAsync(task);
- return RunTestAsync(n, function);
- }
- static Task WhenAnyMemberTcsDirect(int n)
- {
- Func<WithTcs, Task, Task> function =
- (instance, task) => instance.WhenAnyMemberTcsDirectAsync(task);
- return RunTestAsync(n, function);
- }
- static async Task RunTestAsync(int n, Func<WithTcs, Task, Task> function, [CallerMemberName] string name = "")
- {
- Console.WriteLine(name);
- var tasks = new Task[n];
- var sw = new Stopwatch();
- var startBytes = GC.GetTotalMemory(true);
- sw.Start();
- var instance = new WithTcs();
- var step = n / 78;
- for (int i = 0; i < n; i++)
- {
- var iTemp = i;
- Task primaryTask = Task.Run(() => { if (iTemp % step == 0) Console.Write("."); });
- tasks[i] = function(instance, primaryTask);
- }
- await Task.WhenAll(tasks).ConfigureAwait(false);
- Console.WriteLine();
- var endBytes = GC.GetTotalMemory(true);
- sw.Stop();
- GC.KeepAlive(instance);
- GC.KeepAlive(tasks);
- Console.WriteLine(" Time: {0,7:#,0} ms, Memory: {1,10:#,0} bytes", sw.ElapsedMilliseconds, endBytes - startBytes);
- Console.WriteLine();
- }
- static void show_warning_if_debugger_attached()
- {
- if (Debugger.IsAttached)
- Console.WriteLine("WARNING: running with the debugger attached may result in inaccurate resultsrn".ToUpper());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement