public static Task <T> Marshal <T>(this AppDomain appDomain, Func <Task <T> > function) { var m = new MarshalableCompletionSource <T>(); var t = typeof(RemoteWorker <T>); var w = (RemoteWorker <T>)appDomain.CreateInstanceAndUnwrap(t.Assembly.FullName, t.FullName ?? throw new InvalidOperationException()); w.Run(function, m); return(m.Task); }
public void Run <T1>(Func <T1, Task <T> > function, T1 arg1, MarshalableCompletionSource <T> marshaler) { function(arg1).ContinueWith(t => { if (t.IsFaulted) { marshaler.SetException(t.Exception?.InnerExceptions.ToArray()); } else if (t.IsCanceled) { marshaler.SetCanceled(); } else { marshaler.SetResult(t.Result); } }); }