using System.Threading.Tasks;
using System.Collections.Generic;
private static Random _rand = new Random();
public static void Main()
Example1().ConfigureAwait(false).GetAwaiter().GetResult();
Example2().ConfigureAwait(false).GetAwaiter().GetResult();
public static async Task Example1()
var s = new Queue<string>(new[] {"foo", "bar", "baz"});
await WaitUntil(() => s.Dequeue() == "bar");
var shouldBeBaz = s.Dequeue();
Console.WriteLine($"Should be 'baz': {shouldBeBaz}");
public static async Task Example2()
await WaitUntil(EncounteredMultipleOf2);
Console.WriteLine("Found multiple of 2!");
private static bool EncounteredMultipleOf2()
return _rand.Next() % 2 == 0;
public static async Task WaitUntil(Func<bool> condition, int frequency = 25, int timeout = -1)
var waitTask = Task.Run(async () =>
while (!condition()) await Task.Delay(frequency);
if (waitTask != await Task.WhenAny(waitTask,
throw new TimeoutException();