2016-05-23 57 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> 
} 

第一種方法滿足要求,工作正常,而第二種方法不允許編譯。Func <T1, TResult> TResult包裹進任務

如何將實際的T的值傳遞給Task

+0

好,你說的委託是一個函數取一個參數,類型T'的',你有什麼打算爲傳遞該參數的值?你可以執行'Task.Run(new Func (()=> function(someValue)))'。 –

+0

@ LasseV.Karlsen如同在第一個「Task」調用中那樣返回'Task >',而不是'Task '。 – Karolis

回答

2

既然你需要通過一個委託,它不帶任何附加參數Task.Run,你需要通過傳遞T類型的參數來包裝一個參數,採取委託到一個無參數的委託。

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

當然,你需要T類型的實例要傳遞給function代替default(T)。例如,你可以通過Tfunction一起,就像這樣:

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

好的。第二種方法是我正在尋找的。反正沒有更優雅的方式?我的意思是,我最長的方法會有5個參數。 @Carl – Karolis

+1

不幸的是,C#沒有用於部分函數調用的內置功能,因此您需要爲每組參數編寫重載。有關相關主題的討論,請參閱[本問答](http://stackoverflow.com/a/27251027/335858)。 – dasblinkenlight

相關問題