如何 - 具有超时和取消功能的多个异步任务

2024-01-20

我想触发几个任务,同时为它们设置超时。这个想法是收集那些争分夺秒的任务的结果,并取消(甚至忽略)其他任务。

我尝试使用扩展方法 WithCancellation 如所解释的here https://stackoverflow.com/a/25684549/145599,但是抛出异常会导致 WhenAll 返回并且不提供任何结果。

这是我尝试过的,但我也对其他方向持开放态度(但请注意,我需要使用 wait 而不是 Task.Run,​​因为我需要任务中的 httpContext ):

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(3));

IEnumerable<Task<MyResults>> tasks = 
            from url in urls
            select taskAsync(url).WithCancellation(cts.Token);

Task<MyResults>[] excutedTasks = null;

MyResults[] res = null;
try
{
    // Execute the query and start the searches:
    excutedTasks = tasks.ToArray();

    res = await Task.WhenAll(excutedTasks);
}
catch (Exception exc)
{
    if (excutedTasks != null)
    {
        foreach (Task<MyResults> faulted in excutedTasks.Where(t => t.IsFaulted))
        {
            // work with faulted and faulted.Exception
        }
    }
}

// work with res

EDIT:按照下面@Servy的回答,这是我采用的实现:

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(3));

IEnumerable<Task<MyResults>> tasks = 
            from url in urls
            select taskAsync(url).WithCancellation(cts.Token);

// Execute the query and start the searches:
Task<MyResults>[] excutedTasks = tasks.ToArray();

try
{
    await Task.WhenAll(excutedTasks);
}
    catch (OperationCanceledException)
{
    // Do nothing - we expect this if a timeout has occurred
}

IEnumerable<Task<MyResults>> completedTasks = excutedTasks.Where(t => t.Status == TaskStatus.RanToCompletion);

var results = new List<MyResults>();
completedTasks.ForEach(async t => results.Add(await t));

如果任何任务未能完成,您是正确的WhenAll不返回任何结果did完整的,它只是包装了所有失败的聚合异常。幸运的是,您拥有原始的任务集合,因此您可以从那里获得成功完成的结果。

var completedTasks = excutedTasks.Where(t => t.Status == TaskStatus.RanToCompletion);

只需使用它而不是res.

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

如何 - 具有超时和取消功能的多个异步任务 的相关文章

随机推荐

  • GridBagLayout 网格化不起作用

    我正在尝试创建以下 GUI 但我制作的 GUI 是 我的网格是什么样的 image 网格布局 https i stack imgur com Wpzna png 我不明白为什么我会得到这个输出 因为我已经绘制了一个图表来帮助代码并且它似乎可
  • Java 使用带有域和安全的 RestTemplate 设置安全 cookie

    除了下面的问题之外 我如何设置 Cookie 域并标记为 安全 尝试在 Cookie 上设置其他属性 使用 RestTemplate 设置安全 cookie https stackoverflow com questions 5796078
  • 从 git 存储库进行 pip 安装,由于引用错误而出现错误

    问题描述 在 Windows 10 上使用 Python 3 7 6 我尝试升级直接从 git 存储库安装的包 pip install upgrade git https url of my py package git 然后安装失败 er
  • 如何读取pickle文件?

    我创建了一些数据并将其存储了几次 如下所示 with open filename a as f pickle dump data f 每次文件大小增加 但是当我打开文件时 with open filename rb as f x pickl
  • Android获取颜色作为字符串值

    如果我在资源中定义了一种颜色
  • F#,主格或结构类型

    F 有主格类型系统还是结构类型系统 我知道 OCaml 是结构类型的 尽管 F 似乎并非如此 这是正确的吗 F 是主格 您可以通过一些奇异的机制执行一些结构技巧 但该语言的类型系统主要是主格的
  • 使用 ESC 键清除 Angular / AngularUI 中的输入文本字段

    在我的 Angular 应用程序的几个地方 我需要使用 ESC 键清除用户的输入 问题是 我不知道如何使用文本输入字段 文本区域清除正常 看看这个小提琴 jsFiddle演示问题 http jsfiddle net aGpNf 188 Bi
  • 在textview中显示计时器包含android中的天,小时,分钟和秒

    我正在使用倒计时器在文本视图中显示剩余时间 它工作正常 下面是代码 public class MyCount extends CountDownTimer Context mContext public MyCount long milli
  • 如何在文本框中选择文本,并将插入符号置于所选内容的开头?

    我正在使用一个System Windows Forms TextBox 可以使用键盘来选择文本 将插入符号置于start选择的内容 按住 Shift 并将插入符号向左移动 我想以编程方式做同样的事情 例如 假设我有一个文本框 其中包含文本
  • 如何在调试器中使用 Perl 5.10 功能?

    我无法在 Perl 调试器中评估 现代 Perl 代码 在调试文件中的代码时它可以正常工作 但在提示符下却不行 最小的例子 Activating 5 10 features with E it works perl E say x x Ca
  • 为什么要为请求缓存控制 HTTP 标头?

    我最近经历了this https developer mozilla org en US docs Web HTTP Headers Cache Control文章 它说不仅是响应 请求还可以包括cache control选项 虽然我理解
  • 低基数字段的索引效率

    例如 postgres 数据库中有一个字段 可以为空 它存储枚举值 并且该枚举只有两个值 A B 现在我的所有选择查询在该字段上都有 where 子句 我有一个问题 向该字段添加索引将是一个好方法 否则它不会提高任何性能 因为每行包含 A
  • 如何在 php 上打印非空值[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对 PHP 很陌生 现在我正在尝试打印非空值 我有以下 php 代码 它会抛出所有值 包括 null 和非 null 在我的网站中 我只
  • 如何检查 JBoss 是否正在 Unix 服务器上运行?

    我下面有一个脚本 我想根据它是否可以在进程列表中找到 jboss 进程来回显 jboss 未运行 或 jboss 正在运行 但是 当我关闭 Jboss 时 它仍然执行 Else 条件并显示 jboss 正在运行 如果我手动执行 pgrep
  • 无法在 C# 中打开 Excel 文件

    我的项目中有以下 C 函数 该函数应该打开并返回现有的 Excel 工作簿对象 Application excelApp private Workbook OpenXL string path string filename try if
  • Rails 4.1.2 - to_param 转义斜杠(并破坏应用程序)

    我在我的应用程序中使用to param创建自定义 URL 此自定义路径包含斜杠 class Machine lt ActiveRecord Base def to param MachinePrettyPath show path self
  • NHibernate二级缓存在没有缓存配置的情况下缓存实体

    我已经在会话工厂上配置了二级缓存 但是对于 POCO 实体 我没有启用缓存 我使用 Fluent NHibernate 来配置 SessionFactory 和 POCO 实体 这是会话工厂的配置 var cfg Fluently Conf
  • GWT 中的简单超链接?

    这应该很简单 但不知怎的 我找不到在 GWT 中创建简单超链接的方法 基本上 我想在用户单击某些内容时加载另一个页面 超级链接 http google web toolkit googlecode com svn javadoc 1 6 c
  • 在 Haskell 中使用递归方案解决变更问题

    我试图从中理解组织形态关于递归方案的博客 https blog sumtypeofway com posts recursion schemes part 4 html 当我运行示例来解决问题时遇到问题改变问题 https en wikip
  • 如何 - 具有超时和取消功能的多个异步任务

    我想触发几个任务 同时为它们设置超时 这个想法是收集那些争分夺秒的任务的结果 并取消 甚至忽略 其他任务 我尝试使用扩展方法 WithCancellation 如所解释的here https stackoverflow com a 2568