首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将任何给定的函数转换为可等待的任务

将任何给定的函数转换为可等待的任务
EN

Stack Overflow用户
提问于 2015-08-17 16:27:38
回答 6查看 18.7K关注 0票数 18

以下代码的目标是将任何给定的函数转换为可等待的函数。这个想法是在从数据库获取数据时使用它,让代码可以灵活地使用同步获取函数(这是我当前ORM的强制要求),或者使用与异步完全相同的函数。

我知道代码背后的概念可能有很多问题。到目前为止,我只是试图摆脱编译器错误,这样我就可以运行代码并检查行为。但当然,我愿意事先讨论这个概念,如果它背后的整个想法是错误的,那么就更有效地利用我的时间寻找另一个解决方案。

代码语言:javascript
复制
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;
}
EN

回答 6

Stack Overflow用户

发布于 2015-08-17 16:32:49

将其更改为

代码语言:javascript
复制
int task = await CastFuncToTask<int>(()=>TestFunc(2));

在您的代码中,为CastFuncToTask提供的输入是一个int( TestFunc返回的内容)。但它需要一个委托Func<T>

票数 3
EN

Stack Overflow用户

发布于 2015-08-17 17:05:55

我的方法是:

代码语言:javascript
复制
public Task<int> SetOffAsync()
{
    return Task<int>.Factory.StartNew(() =>
    { 
        /*do something else*/
        return 42;
    });
}

你可以这样叫它:

代码语言:javascript
复制
int var = await SetOffAsync();
票数 2
EN

Stack Overflow用户

发布于 2018-08-22 18:55:57

等待Task.Run(() => obj.functionname());

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32045815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档