将Long转换为Task <long>

时间:2019-08-10 20:28:07

标签: c#

我只是从一本书中学习Async编程,呵呵!他们的例子不起作用。

作者(WebAPI2书中的Adam Freeman,第3章,第47页!)想要说明一种技术,当我们拥有一系列同步语句并希望执行它们时,Async。他说

  

这是通过创建一个启动任务来完成的,该任务围绕   我们需要执行并返回Task作为结果的语句   从该方法。

然后他说看这个例子。好惊喜!它甚至无法正常工作,因为它无法从long转换为Task<long>

我应该如何解决此代码?

public interface ICustomController
{
    Task<long> GetPageSize(CancellationToken cancellationToken);
}
public Task<long> GetPageSize(CancellationToken cancellationToken)
{
    WebClient wb = new WebClient();
    Stopwatch sw = Stopwatch.StartNew();

    List<long> results = new List<long>();

    for(int i=0; i<10; i++)
    {
        if (!cancellationToken.IsCancellationRequested)
        {
            Debug.WriteLine("Making Request {0} ", i);
            results.Add(wb.DownloadData(TargetUrl).LongLength);

        }
        else
        {
            Debug.WriteLine("Cancelled...");
            return 0;
        }
    }

    Debug.WriteLine("Elapsed ms: {0} ", sw.ElapsedMilliseconds);

    return (long)results.Average();
}

请注意,他已有意从方法中删除了aysncawait,以便他可以解释此技术。.但是他忘记了实际修复代码。

2 个答案:

答案 0 :(得分:7)

return Task.FromResult((long)results.Average());

这是从非异步函数返回等待结果的方式。

答案 1 :(得分:0)

我认为他想使用{ "widgets": [ { "type": "metric", "x": 0, "y": 0, "width": 24, "height": 9, "properties": { "metrics": [ [ { "expression": "SEARCH('{statusdash/entitycount,Entity} MetricName=\"entitycount\"', 'Sum', 86400)", "id": "e1" } ] ], "view": "singleValue", "stacked": true, "region": "eu-west-2", "start": "-P1D", "end": "P0D", "title": "SearchEntityDash1" } } ] 将工作加载到线程池线程中。 您可以像

一样使用它
Task.Run()

然后,调用方将只能等待返回的public Task<long> GetPageSize(CancellationToken cancellationToken)) { return Task.Run(() => { // body of the original methode }); } 对象。

详细了解Task here

相关问题