using System.Threading.Tasks;
public class Controller {
private Random _random = new Random(Guid.NewGuid().GetHashCode());
private TimeSpan _workDelay = TimeSpan.FromSeconds(1);
Thread.Sleep(_workDelay);
public async Task<int> DoWorkAsync() {
await Task.Delay(_workDelay);
public async Task<int> DoWorkAsync(IProgress<double> progress) {
TimeSpan delay = TimeSpan.FromTicks(_workDelay.Ticks / COUNT);
for (int i = 0; i < COUNT; ++i)
progress.Report(1.0 * (i + 1) / COUNT);
private static bool s_buttonEnabled;
private static string s_labelValue;
private static Controller s_controller = new Controller();
public static async Task Main()
await PretendUserWaitingAsync();
await PretendUserWaitingAsync();
await PretendUserWaitingAsync();
private static void OnClick_1()
var _ = Task.Run((Action)HandleClick_1);
private static void OnClick_2()
var _ = Task.Run((Func<Task>)HandleClick_2Async);
private static void OnClick_3()
var _ = Task.Run((Func<Task>)HandleClick_3Async);
private static void SetResult(int result)
Console.WriteLine("Result: {0}", result);
private static void SetProgress(double progress)
Console.WriteLine("Progress: {0:P2}", progress);
private static async Task PretendUserWaitingAsync()
while (!s_buttonEnabled) {
private static void HandleClick_1()
var result = s_controller.DoWork();
private static async Task HandleClick_2Async()
var result = await s_controller.DoWorkAsync();
private static async Task HandleClick_3Async()
var progress = new Progress<double>(SetProgress);
var result = await s_controller.DoWorkAsync(progress);