【发布时间】:2014-10-23 08:19:39
【问题描述】:
我可以使用以下代码行。问题是编译器一直抱怨这一行。请注意,表达式包含在它自己的异步方法中,因此使用了 await 关键字,并且被调用的方法也是带有异步调用的异步方法。 2个代码示例如下
var tresultString = await Task.FromResult(TestDataRepositoryAsync(testfilePath));
或
var tresultString = await Task.FromResult<List<IResultAd>>(TestDataRepositoryAsync(testfilePath));
当我在不使用 Task.FromResult 的情况下访问返回时,我得到了类型
System.Threading.Tasks.Task`1[System.Collections.Generic.List`1[IResultAd]]
作为我的返回类型。
我得到的错误是
System.Threading.Tasks.Task.FromResult<System.Collections.Generic.List<IResultAd>>(System.Collections.Generic.List<IResultAd>)的最佳重载方法匹配有一些无效参数System.Threading.Tasks.Task.FromResult<System.Collections.Generic.List<IResultAd>>(System.Collections.Generic.List<IResultAd)的最佳重载方法匹配有一些无效参数参数 1:无法从
System.Threading.Tasks.Task<System.Collections.Generic.List<IResultAd>>' to 'System.Collections.Generic.List<IResultAd>转换参数 1:无法从
'System.Threading.Tasks.Task<System.Collections.Generic.List<IResultAd>>' to 'System.Collections.Generic.List<IResultAd>'转换
这是一个来自 MSDN 的示例
// TASK<T> EXAMPLE
async Task<int> TaskOfT_MethodAsync()
{
// The body of the method is expected to contain an awaited asynchronous
// call.
// Task.FromResult is a placeholder for actual work that returns a string.
var today = await Task.FromResult<string>(DateTime.Now.DayOfWeek.ToString());
// The method then can process the result in some way.
int leisureHours;
if (today.First() == 'S')
leisureHours = 16;
else
leisureHours = 5;
// Because the return statement specifies an operand of type int, the
// method must have a return type of Task<int>.
return leisureHours;
}
全部用于上面的同一行代码。我将不胜感激任何帮助理解代码示例的问题。提前致谢。
TestDataRepositoryAsync 方法的签名:
private async Task<List<IResultAd>> TestDataRepositoryAsync(String filePath)
{
using (var testfilestream = File.OpenRead(filePath))
{
var getJsonStringFromFile = new StreamReader(testfilestream).ReadToEndAsync();
var jsonString = await getJsonStringFromFil);
List<IAdvertisement> result = JsonConvert.DeserializeObject<List<IResultAd>>(jsonString);
return result;
}
return null;
}
Task 的 Result 属性让我可以访问我期望的结果。
【问题讨论】:
-
你为什么首先在这里使用
FromResult,尤其是如果你只是马上去await呢?也不要这样做。 -
await Task.FromResult(X)可以简单地重写为X。Task.FromResult(X)创建一个任务,该任务立即完成,结果为X,await给出此结果。也许你只想要await TestDataRepositoryAsync(testfilePath)? -
不,我想从进程中返回一个 List
。我以 msdn 中的示例为例。基本上,对 TestDataRepository(testfilePath) 的调用返回一个 System.Threading.Tasks.Task.FromResult > 并且 Task.FromResult 是返回 List 的实际工作的占位符本身。 -
但是
await TestDataRepositoryAsync(testfilePath)的结果是List<IResult>. -
Task.Result会让你返回结果,但你的代码会阻塞并等待结果可用——换句话说,它是同步运行的。await Task是异步的,没有这个问题。哪个最合适取决于您是使用同步方法还是异步方法。
标签: c# task-parallel-library async-await