【问题标题】:Task<IResult>'s handling of List<IResult> return typesTask<Result>'正在处理 List<Result> 返回类型
【发布时间】: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]]

作为我的返回类型。

我得到的错误是

  1. System.Threading.Tasks.Task.FromResult&lt;System.Collections.Generic.List&lt;IResultAd&gt;&gt;(System.Collections.Generic.List&lt;IResultAd&gt;) 的最佳重载方法匹配有一些无效参数

  2. System.Threading.Tasks.Task.FromResult&lt;System.Collections.Generic.List&lt;IResultAd&gt;&gt;(System.Collections.Generic.List&lt;IResultAd) 的最佳重载方法匹配有一些无效参数

  3. 参数 1:无法从 System.Threading.Tasks.Task&lt;System.Collections.Generic.List&lt;IResultAd&gt;&gt;' to 'System.Collections.Generic.List&lt;IResultAd&gt; 转换

  4. 参数 1:无法从 'System.Threading.Tasks.Task&lt;System.Collections.Generic.List&lt;IResultAd&gt;&gt;' to 'System.Collections.Generic.List&lt;IResultAd&gt;' 转换

这是一个来自 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) 可以简单地重写为XTask.FromResult(X) 创建一个任务,该任务立即完成,结果为Xawait 给出此结果。也许你只想要await TestDataRepositoryAsync(testfilePath)
  • 不,我想从进程中返回一个 List。我以 msdn 中的示例为例。基本上,对 TestDataRepository(testfilePath) 的调用返回一个 System.Threading.Tasks.Task.FromResult> 并且 Task.FromResult 是返回 List 的实际工作的占位符本身。
  • 但是await TestDataRepositoryAsync(testfilePath)的结果 List&lt;IResult&gt;.
  • Task.Result 会让你返回结果,但你的代码会阻塞并等待结果可用——换句话说,它是同步运行的。 await Task 是异步的,没有这个问题。哪个最合适取决于您是使用同步方法还是异步方法。

标签: c# task-parallel-library async-await


【解决方案1】:

正如其他人所指出的,对Task.FromResult 的调用是不必要的。你的代码应该是:

var tresultString = await TestDataRepositoryAsync(testfilePath);

请注意,MSDN 示例明确声明它使用Task.FromResult作为异步工作的占位符,在您的情况下为TestDataRepositoryAsync

附带说明,当您使用异步文件流时,您必须确保显式打开它们以进行异步访问:

using (var testfilestream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))

【讨论】:

    【解决方案2】:

    就我而言,我必须访问返回的任务的结果属性。

    【讨论】:

    • @Gary 这个答案是作者发布的。
    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 2019-08-07
    • 2020-10-18
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    相关资源
    最近更新 更多