using System.Threading.Tasks;
public static void Main(string[] args)
var promTaskBroken = PromiseTask(() => DownloadAsync<string>("http://www.kjkjhkjhkjhkh.com"));
promTaskBroken.Catch(exception =>
Console.WriteLine("Async operation errored.");
Console.WriteLine("Error: " + exception.Message);
Console.WriteLine("Async operation completed.");
Console.WriteLine("Result: " + result);
Console.WriteLine("Waiting");
Console.WriteLine("Sleeping...");
Console.WriteLine("Exiting...");
private static async Task<IPromise<T>> PromiseDownloadAsync<T>(string url) where T : class
Console.WriteLine("Downloading " + url + " ...");
var promise = new Promise<T>();
using(var client = new WebClient())
var task = client.DownloadStringTaskAsync(new Uri(url));
promise.Resolve(result as T);
Console.WriteLine("... Download completed.");
Console.WriteLine("An error occurred... rejecting the promise.");
private static async Task<T> DownloadAsync<T>(string url) where T : class
Console.WriteLine("Downloading " + url + " ...");
using(var client = new WebClient())
var task = client.DownloadStringTaskAsync(new Uri(url));
Console.WriteLine("Download completed.");
Console.WriteLine("An error occurred....");
public static IPromise<T> PromiseTask<T>(Func<Task<IPromise<T>>> asyncTask) where T : class
var promise = new Promise<T>();
asyncTask().ContinueWith(result =>
.Then(res => { promise.Resolve(res); })
.Catch(err => { promise.Reject(err); });
public static IPromise<T> PromiseTask<T>(Func<Task<T>> asyncTask) where T : class
var promise = new Promise<T>();
asyncTask().ContinueWith(result =>
var resultAsRask = result as Task<T>;
if(resultAsRask.Status == TaskStatus.RanToCompletion && resultAsRask.Result != null){
promise.Resolve(resultAsRask.Result);
promise.Reject(new Exception("Task failed"));