2017-04-15 3 views
1

Ich möchte eine asynchrone Methode von einer Reflektionsinstanz Task<T> aufrufen, ich hatte Task.WaitAll und .GetAwaiter().GetResult() verwendet, aber alle sie werden Deadlock verursachen. Wie soll ich jetzt machen?Wie wird die asynchrone Methode in C# mithilfe von Reflection aufgerufen und führt nicht zu einem Deadlock?

Zum Beispiel:

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

Dies ist, wie ich es

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

Wie Methode ohne Stillstand berufen?

+0

Können Sie ein Codebeispiel posten? Was ist der Typ Ihrer Bewerbung? Konsole? Formen gewinnen? asp.net? – areller

+3

Für die Frage, wie man mit Reflection eine Methode aufruft, spielt es keine Rolle, ob es Deadlock verursacht. Für die Frage, wie man auf eine Aufgabe wartet, ohne Deadlock zu verursachen, ist es egal, ob man Reflektion benutzt. Sie sind zwei unabhängige Fragen. Mit welcher der beiden brauchst du Hilfe? – hvd

+0

* Zum Beispiel: ' async Aufgabe Hinzufügen (T-Modell); void InvokeByReflection (Objektmodell) { MethodInfo method = typeof (SAMPLE) .GetTypeInfo(). GetMethod ("Add"); // Wie Methode ohne Deadlock aufrufen? } ' –

Antwort

2

Es ist nicht klar, wie Reflektion etwas mit Deadlock zu tun hat. Asynchron-Methoden aufrufen ist ziemlich einfach:

Kritisch - Notwendigkeit async hier:

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

Optional, wenn Sie im Web sind, vergessen Sie nicht.ConfigureAwait(false);

UPDATE Ergebnisse zu erhalten aus:

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

Ich möchte nur T als Objekt, anstatt" T "in Methodensignatur, –

+0

Sure, siehe meine Bearbeitung. – zaitsman

+0

Wie kann ich das Ergebnis von Add erhalten? –

Verwandte Themen