与 WhenAll 并行执行任务时的任务缓存

2024-02-21

所以我有这个小代码块,它将并行执行多个任务。

// no wrapping in Task, it is async
var activityList = await dataService.GetActivitiesAsync();

// Select a good enough tuple
var results = (from activity in activityList
               select new { 
                Activity = activity, 
                AthleteTask = dataService.GetAthleteAsync(activity.AthleteID)
               }).ToList(); // begin enumeration

// Wait for them to finish, ie relinquish control of the thread
await Task.WhenAll(results.Select(t => t.AthleteTask));

// Set the athletes
foreach(var pair in results)
{
  pair.Activity.Athlete = pair.AthleteTask.Result;
}

因此,我正在下载每个给定活动的运动员数据。但也有可能我们多次请求同一位运动员。 我们如何确保 GetAthleteAsync 方法仅在内存缓存中尚未存在的情况下才联机获取实际数据?

目前我尝试使用ConcurrentDictionary<int, Athelete>在 GetAthleteAsync 方法内

private async Task<Athlete> GetAthleteAsync(int athleteID)
{
       if(cacheAthletes.Contains(athleteID))
             return cacheAthletes[atheleID];

       ** else fetch from web
}

你可以改变你的ConcurrentDictionary缓存Task<Athlete>而不仅仅是Athlete。请记住,一个Task<T>是一个承诺 - 一个最终会产生结果的操作T。所以,你可以缓存运营代替results.

ConcurrentDictionary<int, Task<Athlete>> cacheAthletes;

然后,你的逻辑将是这样的:如果操作已经在缓存中,则立即(同步)返回缓存的任务。如果不是,则开始下载,将下载操作添加到缓存中,并返回新的下载操作。请注意,所有“下载操作”逻辑都移至另一个方法:

private Task<Athlete> GetAthleteAsync(int athleteID)
{
  return cacheAthletes.GetOrAdd(athleteID, id => LoadAthleteAsync(id));
}

private async Task<Athlete> LoadAthleteAsync(int athleteID)
{
  // Load from web
}

这样,对同一运动员的多个并行请求将得到相同的结果Task<Athlete>,每个运动员只下载一次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与 WhenAll 并行执行任务时的任务缓存 的相关文章

随机推荐

  • 如何比较两个具有非连续顺序的随机数的文件?

    有 2 个名为 compare 1 txt 和 compare2 txt 的文件 其中包含非连续顺序的随机数 猫比较1 txt 57 11 13 3 889 014 91 猫比较2 txt 003 889 13 14 57 12 90 Ai
  • 如何在不使用边框的情况下更改 a 标签的下划线粗细?

    我经常对按钮使用 a 标签 因此它们有一个填充 使它们像按钮一样 如何更改文本装饰下划线的粗细 人们经常建议为此使用边框底部 但是 底部边框不是下划线 有些字母甚至延伸到下划线以下 下划线比某物下面的线复杂得多 正如所解释的 我已经使用了相
  • 如何将 .NET 库移动到子目录?

    我想将我的应用程序使用的所有库 dll 放入一个子目录 假设名为 lib 如何指示程序集加载器在该特定目录 这是主程序集所在的目录的子目录 中查找引用的程序集 我认为应该通过 app config 中的一些设置来完成 对吗 探测路径 htt
  • 哈希表中关键内容的最佳实践

    最好的查找结构是HashTable 它提供持续的访问一般 最坏情况下呈线性 这取决于哈希函数 好的 我的问题如下 假设一个良好的实施HashTable e g HashMap关于映射中传递的键是否有最佳实践 我的意思是建议键必须是不可变的对
  • 为什么这个从未来列表到未来列表的转换能够编译并起作用?

    免责声明 下面的代码片段与正在进行的 Coursera 课程之一相关 我们假设它只是出于学习目的而发布 不应用于作为家庭作业的解决方案提交 正如下面的评论所述 我们需要将 Future 列表转换为列表的单个 Future 更重要的是 如果至
  • 如果条件唯一,MySQL 的非重复计数

    我正在尝试构建一个查询 告诉我给定数据集中有多少个不同的女性和男性 该人通过号码 电话 来识别 同一个 tel 可以出现多次 但该 tel 的性别只能计算一次 7136609221 男7136609222 男7136609223 女7136
  • 具有多个组的导航视图根据条件隐藏和显示组

    I have NavigationView具有多个组 基于某些条件我需要隐藏和显示组 我怎样才能实现这个目标 我的样品NavigationView menu menu menu
  • 我该如何修改这个SQL语句呢?

    我的 SQL Server 视图 SELECT geo HyperLinks CatID geo Tags Tag geo HyperLinks HyperLinksID FROM geo HyperLinks LEFT OUTER JOI
  • 快速 cookie 返回未定义

    我试图在express js 上设置cookie 但它返回未定义 我搜索了很多网页并把express cookieParser above app use app router 但它仍然无法返回正确的值 app js app configu
  • 平滑画布动画

    我正在尝试学习如何使用 HTML5 的画布创建流畅的 JavaScript 动画 由于某种原因 动画并不流畅 而是有点 溅射 你可以看到我构建的框架这个jsFiddle http jsfiddle net 3TAVu 目前仅使用 Webki
  • C++ 模板“延迟实例化”

    C 模板中的 延迟实例化 是什么意思 延迟实例化是指直到第一次使用相应实体时才实例化模板 例如 您有一个模板化函数 template
  • javascript创建多维数组语法[重复]

    这个问题在这里已经有答案了 今天我听说可以使用以下语法在 js 中创建多维数组 var a new Array 3 3 a 2 2 2 alert a 2 2 然而这在歌剧中不起作用 我有什么地方说错了吗 是的 你有地方错了 var a n
  • git 存储库在 Linux 中从 jenkins 连接时出现 403 错误

    嗨 我只想将我的项目从 github 配置到 jenkins 来生成 build gradle 文件 我收到以下错误 Failed to connect to repository Command usr bin git ls remote
  • 如何在IPython中自动设置默认路径

    我使用 WingIDE 进行开发 使用 Ipython 运行脚本 我在几个方面面临一些不便 每当我更新代码时 我都必须重新加载模块才能在 IPython 中更新它 为了解决我遵循的问题绳文杉 https stackoverflow com
  • 如何从 jenkins 构建 Visual Studio 安装程序项目(.vdproj)以生成 .exe 和 .msi 文件?

    我有一个 Visual Studio 安装程序项目 vdproj 我想从 jenkins 构建它 有人可以为我提供解决方案吗 我尝试使用 msbuild 但它不适合我 然后我在批处理文件中尝试了以下操作 devenv exe pathToP
  • AngularUI:为什么模态没有作为指令实现?

    我在我的项目中使用 Angular ui 我想实现一个模式窗口 库的大部分组件 http angular ui github io bootstrap http angular ui github io bootstrap 作为指令实现 如
  • 在 GWT 中需要应用程序范围的 CSS 常量

    我想在 GWT CssResource 中将一些颜色定义为常量 并在整个应用程序中使用这些常量 但我不知道该怎么做 我会告诉你我已经尝试过什么 我创建了一个 ClientBundle 和一个 CssResource 如下所示 public
  • 将 SDL2 库与 pkg-config 链接

    我使用的是 Ubuntu 14 04LTS 我已经通过从源代码编译安装了 SDL2 库 方法 1https askubuntu com questions 344512 what is the general procedure to in
  • 谷歌分析的 setCredentialStore 方法的替代方法

    我使用以下代码来授权已安装的应用程序访问用户的受保护数据 private Analytics iniAnalytics String secureFolder try HttpTransport httpTransport GoogleNe
  • 与 WhenAll 并行执行任务时的任务缓存

    所以我有这个小代码块 它将并行执行多个任务 no wrapping in Task it is async var activityList await dataService GetActivitiesAsync Select a goo