using System;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
class TestAwaiter<T> : INotifyCompletion {
private T result;
private Action continuation;
// INotifyCompletion Implement
public void OnCompleted(Action continuation) { this.continuation = continuation; }
// Compiler Call Methods
public bool IsCompleted { get; private set; }
public T GetResult() { return result; }
public TestAwaiter<T> GetAwaiter() { return this; }
// Self Call Methods
public void SetResult(T ret) {
result = ret;
if (continuation != null) {
continuation();
}
}
}
class Test {
public static void Main(string[] args) {
Task.Run(new Action(task1));
Console.ReadLine();
}
private async static void task1() {
Console.WriteLine("Begin await:");
int ret = await testAwaiter();
Console.WriteLine("Await Task Result:" + ret);
}
private static TestAwaiter<int> testAwaiter() {
TestAwaiter<int> awaiter = new TestAwaiter<int>();
ThreadPool.QueueUserWorkItem(_ => {
Thread.Sleep(3000);
awaiter.SetResult(100);
});
return awaiter;
}
}