强制转换Task<到极点

本文关键字:极点 Task 转换 | 更新日期: 2023-09-27 18:16:56

如何将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任务异步,并且这个方法需要很长时间才能完成时使用的结果关键字。

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

Thanks in advance

强制转换Task<到极点

来自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"请求结果。这将等待asnyc函数完成(将阻塞代码直到完成),直到结果准备好。

问题是,当异步运行时,您无法预测何时会完成某些操作,因此我们告诉Task何时准备好等待结果。可以马上做,也可以5分钟后做。Await将等待函数完成所需的时间。

你不能将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是最简单的,特别是如果您可以访问调用和被调用方法的源,从而可以确保不会发生死锁。