2016-05-23 5 views
1
public Task<Tresult> WrapIntoTask<Tresult>(Func<Tresult> function) 
where Tresult : class 
{ 
    return Task.Run(function); 
} 
public Task<Tresult> WrapIntoTask<T, Tresult>(Func<T, Tresult> function) 
where Tresult : class where T : class 
{ 
    return Task.Run(function); // Cannot pass in Func<T1, Tresult> 
} 

Erste Methode erfüllt die Anforderungen und funktioniert gut, während zweite Methode kompilieren nicht erlaubt.Func <T1, TResult> TResult in Aufgabe eingepackt

Wie geht man in T Wert in Task?

+0

Nun, haben Sie gesagt, dass die Delegierten eine Funktion ist, einen einzelnen Parameter vom Typ 'T' nehmen, was Sie tun wollen, wenn übergeben ein Wert für diesen Parameter? Sie könnten 'Task.Run (new Func (() => function (someValue)))'. –

+0

@ LasseV.Karlsen Das gibt 'Task >' zurück, nicht 'Task ', wie es beim ersten 'Task'-Aufruf der Fall ist. – Karolis

Antwort

2

Da Sie einen Delegierten übergeben müssen, die keine zusätzliche Parameter Task.Run nimmt, müssen Sie in einem No-Argument Delegierten einen Parameter Mitnahmen Delegierten wickeln, indem ein Parameter des Typs T vorbei.

return Task.Run(() => function(default(T))); 
//        ^^^^^^^^^^ 
//       Replace this 

Natürlich können Sie die Instanz des Typs müssen T zu function anstelle von default(T) weitergegeben werden. Zum Beispiel könnten Sie T zusammen mit function, wie dies passieren:

public Task<Tresult> WrapIntoTask<T, Tresult>(Func<T, Tresult> function, T arg) 
where Tresult : class where T : class 
{ 
    return Task.Run(() => function(arg)); 
} 
+0

Ok. Der zweite Ansatz ist, was ich gesucht habe. Wie auch immer, gibt es keinen eleganteren Weg? Ich meine, meine längste Methode würde 5 Params haben. – Karolis

+1

@Carl Leider verfügt C# über keine integrierten Funktionen für den Aufruf von Teilfunktionen. Daher müssen Sie Überladungen für jeden Parametersatz schreiben. Unter [this Q & A] (http://stackoverflow.com/a/27251027/335858) finden Sie eine Diskussion zu einem verwandten Thema. – dasblinkenlight

Verwandte Themen