Beispiel #1
0
        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);
        }
Beispiel #2
0
		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;
		}