以下代码的目标是将任何给定的函数转换为可等待的函数。这个想法是在从数据库获取数据时使用它,让代码可以灵活地使用同步获取函数(这是我当前ORM的强制要求),或者使用与异步完全相同的函数。
我知道代码背后的概念可能有很多问题。到目前为止,我只是试图摆脱编译器错误,这样我就可以运行代码并检查行为。但当然,我愿意事先讨论这个概念,如果它背后的整个想法是错误的,那么就更有效地利用我的时间寻找另一个解决方案。
async static void Main()
{
// The following line gives a compiler error:
// Error 1 The best overloaded method match for 'CastFuncToTask<int>(System.Func<int>)' has some invalid arguments
int task = await CastFuncToTask<int>(TestFunc(2));
}
private static Task<T> CastFuncToTask<T>(Func<T> func)
{
TaskCompletionSource<T> taskCompletionSource = new TaskCompletionSource<T>();
T result = func.Invoke();
taskCompletionSource.SetResult(result);
return taskCompletionSource.Task;
}
private static int TestFunc(int testInt)
{
return testInt * 2;
}
发布于 2015-08-17 16:32:49
将其更改为
int task = await CastFuncToTask<int>(()=>TestFunc(2));
在您的代码中,为CastFuncToTask
提供的输入是一个int
( TestFunc
返回的内容)。但它需要一个委托Func<T>
。
发布于 2015-08-17 17:05:55
我的方法是:
public Task<int> SetOffAsync()
{
return Task<int>.Factory.StartNew(() =>
{
/*do something else*/
return 42;
});
}
你可以这样叫它:
int var = await SetOffAsync();
发布于 2018-08-22 18:55:57
等待Task.Run(() => obj.functionname());
https://stackoverflow.com/questions/32045815
复制相似问题