2017-04-15 38 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

如何獲得添加的結果? –

相關問題