如何使用任务有条件地异步运行代码

2024-01-01

我有一个负责检索资源的类,该类还缓存它们以便快速访问。 该类公开了用于检索资源的异步方法:

public Task<object> GetResourceAsync(string resourceName)
{
    return Task.Factory.StartNew<object>(() =>
    {
        // look in cache

        // if not found, get from disk

        // return resource
    });
}

客户端代码如下所示:

myResourceProvider.GetResourceAsync("myResource")
    .ContinueWith<object>(t => Console.WriteLine("Got resource " + t.Result.ToString()));

这样,始终使用后台线程。但是,如果在缓存中找到该对象,我不希望代码异步运行。 如果在缓存中找到它,我想立即返回资源,而不必使用另一个线程。

Thanks.


.NET 4.5 有Task.FromResult http://msdn.microsoft.com/en-us/library/hh194922%28v=vs.110%29.aspx可以让你返回一个Task<T>,但它不是在线程池线程上运行委托,而是显式设置任务的返回值。

所以在你的代码的上下文中:

public Task<object> AsyncGetResource(string resourceName)
{
    object valueFromCache;
    if (_myCache.TryGetValue(resourceName, out valueFromCache)) {
        return Task.FromResult(valueFromCache);
    }
    return Task.Factory.StartNew<object>(() =>
    {
        // get from disk
        // add to cache
        // return resource
    });
}

如果您仍在使用 .NET 4.0,则可以使用TaskCompletionSource<T> http://msdn.microsoft.com/en-us/library/dd449174.aspx做同样的事情:

var tcs = new TaskCompletionSource<object>();
tcs.SetResult(...item from cache...);
return tcs.Task;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用任务有条件地异步运行代码 的相关文章

随机推荐

  • Excel 2010、VBA 和 ListObjects 小计未随表更改而更新

    因此 具有以下结构 从 A1 开始 显示片段 gt 运行 table border color BBB border width 0px 0px 1px 1px border style dotted body font 12px Aria
  • do 块内的 Haskell where 子句语法

    我正在尝试重构mapM a 内的函数调用doHaskell 中的块 我想将 lambda 提取到 本地 命名函数以使代码更具可读性 我的代码最初看起来像这样 do mapM x gt x 1 aList return aValue 我想把它
  • FFMPEG H264 压缩预设会影响视频质量吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我绝对不是 FFMPEG 专家 但根据这个文件 http ffmpeg org trac ffmpeg wiki x264EncodingGuide
  • 遮罩图像,从多个渐变创建矩形

    我有一个径向渐变用作mask image将图像 淡入 background color behind图片 mask image radial gradient ellipse at center rgba 255 255 255 1 1 r
  • 如何使用 javascript 创建 xhtml 元素

    如何使用 javascript 动态创建 html 元素 我想在表格单元格内添加一个复选框 所以我希望代码看起来像这样 td td
  • 将 GraphQL 数据拉入 gatsby-browser.js (或更好的解决方案,请)

    我正在尝试运行一个GraphQL里面查询replaceRouterComponent从内部gatsby browser js 盖茨比浏览器API https www gatsbyjs org docs browser apis 然而 我可以
  • 什么是特殊目的寄存器? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 什么是特殊用途寄存器 特殊用途寄存器的名称是什么 以及每个寄存器的一些描述 顾名思义 特殊用途寄存器是专为任务而设计的寄存器 例如 c
  • Dart 支持参数化单元测试吗?

    我想运行一个 Dart 测试 该测试使用一组输入和预期输出重复进行 类似于 JUnit 的情况 我编写了以下测试来实现类似的行为 但问题是 如果所有测试输出计算不正确 则测试只会失败一次 import package test test d
  • Flask 应用程序使用 opencv 运行速度非常慢

    我有一个烧瓶应用程序 它从相机读取帧并将其传输到网站 相机 py from threading import Thread from copy import deepcopy import queue import cv2 class Ca
  • 为什么我不能用 std::unordered_map 替换 std::map

    这个问题可能有点粗略 因为我家里没有可用的代码 但我知道这件事否则会困扰我整个周末 当我尝试将一些代码更新到 C 11 时 我开始替换一些代码std map with std unordered map 该代码仅使用std map find
  • CGRectContainsRect 不工作

    我用这个方法有问题 我有两个显然彼此包含的矩形 我什至手动绘制了它们的坐标以确保 当我使用 CGRectContainsRect 比较这两个矩形时 它返回 false 对于我的一生 我已经尝试了一切 搜索了网络 但我找不到这个问题的答案 有
  • 使用 jQuery 从 HTML 文本查询脚本元素

    我正在通过以下方式加载页面 ajax 并插入parts将结果放入页面的相应部分 ajax url whole page html success function data status xhr result xhr responseTex
  • Jenkins:将用户定义的变量传递给 Email-Ext 插件

    我使用 Email Ext 插件在声明性管道的构建后阶段的构建结束时发送结果电子邮件 在电子邮件正文中 我尝试插入一些环境变量和一些用户定义的环境变量 内置变量显示正常 但是我定义的任何用户定义变量在电子邮件正文中都是空的 或者在 Atta
  • Visual Studio 2017 中的 React 项目

    我想在 Visual Studio 2017 中与我的 NET 应用程序一起开发 React 应用程序 在同一解决方案中 我正在使用 TypeScript 所以我想要一个可以自定义构建的项目类型 我想对项目进行 webpack 等 所以标准
  • Swing 组件不显示泰文字符

    我有一个简单的摆动应用程序 当我将泰语文本设置为 JLabel 或其他组件时 它们显示像问号的字符而不是泰语文本 有什么办法可以在 Swing 应用程序中支持泰语吗 没有特殊的功能或配置要做 确保您的字体支持泰语字符 当我遇到同样的问题时
  • 如何在 BaseColumns 中使用 _COUNT

    我一直在读BaseColumns https developer android com reference android provider BaseColumns html https developer android com ref
  • 在辅助屏幕上显示 NSWindow

    我想显示一个NSWindow在辅助监视器上全屏显示情节提要中创建的 以下代码导致窗口显示在主屏幕 主屏幕上 Y 原点没问题 但 X 原点是 0 它应该是 1680 下面的代码在优胜美地之前有效 NSScreen screen NSScree
  • RxAndroid 3主线程

    我正在尝试在 Rx3 中找到 subscribeOn 的主线程 Single just getHeavyData subscribeOn Schedulers io observeOn AndroidSchedulers mainThrea
  • 使用网络服务发现在 Java 服务器和 Android 客户端之间进行通信

    我正在构建一个 Java 服务器应用程序 在 PC 上运行 它使用以下命令将自身注册到本地网络JmDNS http jmdns sourceforge net 以及一个 Android 客户端应用程序 该应用程序应该使用以下命令发现 jav
  • 如何使用任务有条件地异步运行代码

    我有一个负责检索资源的类 该类还缓存它们以便快速访问 该类公开了用于检索资源的异步方法 public Task GetResourceAsync string resourceName return Task Factory StartNe