将 Task<T> 转换为 T

9

如何将 Task<IEnumerable<IMapLocationItem>> 转换为 IEnumerable<IMapLocationItem>

这是获取 Task<IEnumerable<IMapLocationItem>> 的代码:

public async Task<IEnumerable<IMapLocationItem>> GetAllMapLocationItemsFromUserName(string userName)
{
    IEnumerable<IMapLocationItem> mapLocationImageGalleries = await db.mapLocationImageGalleries.Where(m => m.userName.Equals(userName)).ToListAsync();
    IEnumerable<IMapLocationItem> mapLocationVideoGalleries = await db.mapLocationVideoGalleries.Where(m => m.userName.Equals(userName)).ToListAsync();

    IEnumerable<IMapLocationItem> mapLocationItemsCombined = mapLocationImageGalleries.Concat(mapLocationVideoGalleries);
    return mapLocationItemsCombined;
}

我可以使用关键字.Result,但我在某个地方读到过,这会使async任务失去异步性,并且当使用Result关键字时,该方法需要很长时间才能完成。

Task<IEnumerable<IMapLocationItem>>强制转换为IEnumerable<IMapLocationItem>的最佳方法是什么?

提前致谢


2
为什么不能在调用“GetAllMapLocationItemsFromUserName”函数的函数中使用“await”关键字? - Scott Chamberlain
它会破坏异步,因为调用者没有等待函数完成。为了强制执行这一点,您可以使用await。 - Serguei Fedorov
2个回答

14

来自 MSDN 网站 http://msdn.microsoft.com/en-us/library/hh191443.aspx

 // Signature specifies Task<TResult>
 async Task<int> TaskOfTResult_MethodAsync()
 {
     int hours;
     // . . .
     // Return statement specifies an integer result.
     return hours;
 }

 // Calls to TaskOfTResult_MethodAsync
 Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync();
 int intResult = await returnedTaskTResult;
 // or, in a single statement
 int intResult = await TaskOfTResult_MethodAsync();

你不能将任务强制转换为结果,这样会破坏异步的目的。上面的代码是异步调用函数,然后在代码的后面通过调用 "await" 请求结果。这将等待异步函数完成(阻塞代码直到完成)直到结果准备好。

问题在于,当异步运行时,无法预测何时会完成某个任务,因此我们告诉任务在最终准备好等待结果时。它可以立即完成或者需要 5 分钟时间。"await" 将等待函数完成所需的时间。


12
你不能将Task<T>转换为T,它们代表不同的东西。一个Task<T>代表一个将来最终会返回T的任务。如果你想要获取任务的结果,你有几个选项(假设t = Task<T>):
  • t.Result阻塞执行,直到结果可用。这样做的不幸副作用是在某些情况下可能会死锁,尤其是与UI线程中的async方法结合使用时。
  • await t调度一个延续并在结果可用时运行它。仅适用于C# 5和.NET 4.5或.NET 4与Microsoft.Bcl.Async库。
  • t.ContinueWith调度一个延续并在结果可用时运行它。
总的来说,我更喜欢使用awaitContinueWith,但有时使用Result是最简单的,特别是如果你可以访问调用和被调用方法的源代码,因此可以确保不会发生死锁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接