为了账号安全,请及时绑定邮箱和手机立即绑定

将 Long 转换为 Task<long>

将 Long 转换为 Task<long>

C#
狐的传说 2023-08-20 15:11:09
我只是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
查看完整描述

2 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

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

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


查看完整回答
反对 回复 2023-08-20
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

我假设他想用来Task.Run()将工作加载到线程池线程。你可以像这样使用它


public Task<long> GetPageSize(CancellationToken cancellationToken))

{

    return Task.Run(() => 

    {

         // body of the original methode

    });

}

调用者可以等待返回的Task对象。


查看完整回答
反对 回复 2023-08-20
  • 2 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信