3

在我的数据访问层中,我试图创建返回类型为 Task 的方法。

我无法从实体框架中获取返回类型以返回Task<List<MYtype>>

   public static Task<List<ILeaf>> GetLeafs(int doorID)
    {
        using (var db = new StorefrontSystemEntities())
        {
            return db.proc_GetDoorLeafs(doorID).ToList<ILeaf>();
        };
    }

使其正确运行的唯一方法是像这样格式化代码:

 public async static Task<List<ILeaf>> GetLeafs(int doorID)
    {
        return await Task.Run(() =>
            {
                using (var db = new StorefrontSystemEntities())
                {
                    return db.proc_GetDoorLeafs(doorID).ToList<ILeaf>();
                };
            });
    }

我问的原因是因为我想提供运行异步的选项,还是我没有正确理解这一点?如果我可以只返回一个任务,那么在调用端,如果我想运行异步,我可以选择等待,但如果我想同步运行,我会照常调用该方法。

如果我要返回一个任务,我是否总是必须在方法签名中包含 async 关键字?

我在想这个错误的方式吗?如果我的返回类型为 Task 那么该方法可以选择异步调用还是同步调用?

但是,如果我在方法签名中有 async 和 Task ,那么无论如何该方法都会运行 async ?

谢谢!

4

2 回答 2

13

因此,要回答所提出的字面问题,您可以这样做:

public static Task<List<ILeaf>> GetLeafs(int doorID)
{
    return Task.Run(() =>
        {
            using (var db = new StorefrontSystemEntities())
            {
                return db.proc_GetDoorLeafs(doorID).ToList<ILeaf>();
            };
        });
}

也就是说,请注意这不是一个特别有用的方法。利用异步编程的想法是,您不希望有一个线程池线程坐在那里,除了等待这个 IO 操作之外什么都不做。理想情况下,您会利用本质上是异步的 IO;本身自然返回任务的方法。

通过将阻塞 IO 包装在对Task.Run. 如果他们需要在后台线程中运行该操作,他们可以自己执行,然后他们会更准确地知道这不是天真的异步操作。

请参阅我应该为同步方法公开异步包装器吗?有关该主题的更多信息。

于 2013-05-30T15:56:58.367 回答
7
public static async Task<List<ILeaf>> GetLeafs(int doorID)
{
    using (var db = new StorefrontSystemEntities())
    {
        var result = db.proc_GetDoorLeafs(doorID).ToList<ILeaf>();
        return await Task.FromResult(result);
    }
}
于 2013-11-08T04:43:22.673 回答