using System.Threading.Tasks;
using System.Runtime.Remoting.Messaging;
static async Task WorkAsync(CancellationToken token)
await Task.Delay(1000, token);
throw new ApplicationException("Surprise!");
static async Task TestAsync(int timeout)
var cts = new CancellationTokenSource(timeout);
await WorkAsync(cts.Token).Convert();
Console.WriteLine(ex.Message);
static async Task TestCallContextAsync()
const string key = "some_key";
CallContext.LogicalSetData(key, "some_value");
await Task.Delay(100).Convert();
Console.WriteLine(key + ": " + CallContext.LogicalGetData(key));
public static void Main()
TestCallContextAsync().Wait();
Console.WriteLine("Enter to exit...");
public static readonly Empty Value = default(Empty);
public static class TaskExt
public static Task<Empty> Convert(this Task @this)
return @this.ContinueWith(t =>
t.GetAwaiter().GetResult();
}, TaskContinuationOptions.ExecuteSynchronously);