2017-04-15 21 views
1

我想要调用由Task<T>的反射式实例的异步方法,我用了Task.WaitAll.GetAwaiter().GetResult(),但所有这些会导致死锁。 现在该怎么办?如何通过使用反射调用C#中的异步方法,不会导致死锁?

例如:

鉴于

async Task<T> Add<T>(T model); 

这是我要做的事

void InvokeByReflection(object model) { 
    MethodInfo method = typeof(SAMPLE).GetTypeInfo().GetMethod("Add"); 
} 

如何调用方法,无需僵局?

+0

你可以发布一个代码示例?什么是你的应用程序的类型?安慰?赢得表格? asp.net? – areller

+3

对于如何使用反射来调用方法的问题,它是否导致死锁是无关紧要的。对于如何在不导致死锁的情况下等待任务的问题,您是否使用反射是无关紧要的。他们是两个无关的问题。你需要哪一方面的帮助? – hvd

+0

*例如: ' async任务添加(T型号); void InvokeByReflection(object model) MethodInfo method = typeof(SAMPLE).GetTypeInfo()。GetMethod(“Add”); //如何调用没有死锁的方法? } ' –

回答

2

目前尚不清楚如何反思有什么关系僵局。 调用异步方法是相当简单:

严重 - 需要异步这里:

async void InvokeByReflection(SAMPLE sample, object model) { 
    await (Task)typeof(SAMPLE).GetTypeInfo().GetMethod("Add").MakeGenericMethod(new []{model.GetType()}).Invoke(sample, new object[]{ model }); 
} 

或者,如果您在网上的时候,不要忘了.ConfigureAwait(false);

UPDATE得到结果出:

async void InvokeByReflectionAndgetResult(SAMPLE sample, object model) { 
    var task =(Task)typeof(SAMPLE).GetTypeInfo().GetMethod("Add").MakeGenericMethod(new []{model.GetType()}).Invoke(sample, new object[]{ model }); 
    await task; 
    var result = task.GetType().GetProperty("Result").GetValue(task); 
    } 
+0

我想只投T作为对象,而不是包括方法签名“T”, –

+0

当然,看到我的编辑。 – zaitsman

+0

如何获得添加的结果? –

相关问题