强制转换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
来自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
调度延续并在结果可用时运行它。
一般来说,我更喜欢使用await
或ContinueWith
,但有时使用Result
是最简单的,特别是如果您可以访问调用和被调用方法的源,从而可以确保不会发生死锁。