簡體   English   中英

使用LINQ select返回異步任務

[英]Return async task using LINQ select

我想實現從數據庫異步返回子項列表的函數。 所以我寫了一個函數:

    public async Task<IEnumerable<object>> GetFiles(int parentId)
    {
        var data = from file in DB.Files
                   where file.ParentId == parentId
                   select new { name = file.Name, id = file.Id };
        return data;
    }

但是我可以看到一個警告:異步方法las'等待'運算符並將同步運行。 如何將此函數重寫為異步?

你可以使用ToListAsync()

https://msdn.microsoft.com/en-us/library/dn220258(v=vs.113).aspx

var data = await DB.Files
    .Where(file => file.ParentId == parentId)
    .Select
        (
            new 
            { 
                name = file.Name,
                id = file.Id 
            }
        ).ToListAsync();
return data;

或者:

var data = from file in DB.Files
           where file.ParentId == parentId
           select new { name = file.Name, id = file.Id };
return await data.ToListAsync();

請注意,這將查詢數據。 此外,您可以重新考慮您的方法名稱。 當方法是異步時, 命名約定建議您將“Async”附加到方法名稱。

按照慣例,您將“Async”附加到具有Async或async修飾符的方法的名稱。

ToListAsync()方法不再使用enumarable。 你可以使用如下的FromResult方法:

var data = from file in DB.Files
           where file.ParentId == parentId
           select new { name = file.Name, id = file.Id };
    return await Task.FromResult(data);

在某些情況下,您應該使用Task.run

 public async Task<IEnumerable<object>> GetFiles(int parentId)
    {
        var data = await Task.Run(()=> from file in DB.Files
                   where file.ParentId == parentId
                   select new { name = file.Name, id = file.Id }).ToList();
        return data;
    }

或者你可以使用, TaskCompletionSource -

public static async Task<string> ReturnAsync()
{
    var tsc = new TaskCompletionSource<string>();
    tsc.SetResult("hello world");
    return await tsc.Task;
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM