public object Invoke(MethodInfo method, IEnumerable args) { var ms = new MemoryStream(); Type expectedType = null; _serializer.SerializeCall(ms, _binder, _targetName, new MethodCall { Method = method, Arguments = args.Cast <object>().ToArray() }); ITaskCompletionSource tcs; if (method.ReturnType == typeof(Task)) { tcs = new TcsWrapper <object> (); } else if (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task <>)) { expectedType = method.ReturnType.GetGenericArguments()[0]; tcs = (ITaskCompletionSource) Activator.CreateInstance( typeof(TcsWrapper <>).MakeGenericType(expectedType)); } else { throw new InvalidOperationException("Non Task/Task<T> return values aren't supported"); } SendAndParseResponse(ms.ToArray(), expectedType).ContinueWith(t => { if (t.IsFaulted) { tcs.SetException(t.Exception); return; } var rslt = t.Result; if (rslt.Exception != null) { tcs.SetException(new Exception(rslt.Exception)); } else { tcs.SetResultOrCastException(rslt.Result); } }); return(tcs.Task); }
public object Invoke(MethodInfo method, IEnumerable args) { var ms = new MemoryStream(); Type expectedType = null; _serializer.SerializeCall(ms, _binder, _targetName, new MethodCall { Method = method, Arguments = args.Cast<object>().ToArray() }); ITaskCompletionSource tcs; if (method.ReturnType == typeof (Task)) tcs = new TcsWrapper<object> (); else if (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof (Task<>)) { expectedType = method.ReturnType.GetGenericArguments()[0]; tcs = (ITaskCompletionSource) Activator.CreateInstance( typeof (TcsWrapper<>).MakeGenericType(expectedType)); } else throw new InvalidOperationException("Non Task/Task<T> return values aren't supported"); SendAndParseResponse(ms.ToArray(), expectedType).ContinueWith(t => { if (t.IsFaulted) { tcs.SetException(t.Exception); return; } var rslt = t.Result; if (rslt.Exception != null) tcs.SetException(new Exception(rslt.Exception)); else tcs.SetResultOrCastException(rslt.Result); }); return tcs.Task; }