将 Long 转换为 Task<long>

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


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


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


然后他说看这个例子。好惊喜!它甚至不起作用,因为它无法从 转换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();

}

请注意,他故意从方法中删除了aysncand ,以便他可以解释这种技术......但他忘记了实际修复他的代码。await


狐的传说
浏览 80回答 2
2回答

温温酱

return&nbsp;Task.FromResult((long)results.Average());这是从非异步函数返回可等待结果的方式。

守着星空守着你

我假设他想用来Task.Run()将工作加载到线程池线程。你可以像这样使用它public Task<long> GetPageSize(CancellationToken cancellationToken)){    return Task.Run(() =>     {         // body of the original methode    });}调用者可以等待返回的Task对象。
打开App,查看更多内容
随时随地看视频慕课网APP