具有动态延迟的C#任务

伊万·马克·德博诺

我有一个函数,一次需要处理3个项目,并且如果所花费的总时间少于x秒,则该线程应休眠剩余的几秒钟,然后再继续操作。

因此,我正在执行以下操作:

    private void ProcessItems()
    {
        for (int i = 0, n = items.Count; i < n; i++)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            batch.Add(items[i]);

            if (batch.Count == 3 || i >= items.Count - 3)
            {
                List<Task> tasks = new List<Task>(3);

                foreach (Item item in batch)
                    tasks.Add(Task.Factory.StartNew(() => ProcessItem(item)));

                Task.WaitAll(tasks.ToArray());

                batch.Clear();
            }

            stopwatch.Stop();

            int elapsed = (int)stopwatch.ElapsedMilliseconds;
            int delay = (3000) - elapsed;

            if (delay > 0)
                Thread.Sleep(delay);
        }
    }

ProcessItem函数进行Web请求并处理响应(回调)。此功能需要少量时间。

但是,如果我正确理解任务,那么一个线程可以有多个任务。因此,如果我休眠线程,其他任务可能会受到影响。

有没有更有效的方法来实现上述目的,并且可以在Parallel.Foreach中使用任务吗?

usr

任务在自动管理的线程上运行。阻塞线程本质上没有错。只是有点浪费。

这是我非常干净地实现此方法的方法:

MyItem[] items = ...;
foreach(MyItem[] itemsChunk in items.AsChunked(3)) {
 Parallel.ForEach(itemsChunk, item => Process(item));
 //here you can insert a delay
}

这不会浪费单个线程,而且非常简单。Parallel.ForEach也使用当前线程来处理工作项,因此它不会处于空闲状态。您也可以添加延迟逻辑。AsChunked留给读者练习是一种实现。...该功能应将列表拆分为给定大小的块(3)。这样的辅助功能的好处是,它使批处理逻辑与重要部分脱离了关系。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有动态延迟的C#任务

来自分类Dev

c#并行For循环,具有微小延迟

来自分类Dev

在C#中测量任务之间的延迟

来自分类Dev

具有自定义任务的C#任务重写功能

来自分类Dev

SSIS脚本任务C#编码可动态选择具有特定名称的最新Excel文件的第一张纸

来自分类Dev

如何在C#中具有动态Nunit TestCaseSource?

来自分类Dev

具有动态LINQ的C#布尔逻辑?

来自分类Dev

具有继承类型的C#列表的动态实例

来自分类Dev

在具有动态属性的linQ c#中进行过滤

来自分类Dev

Selenium C# - FindElement 具有动态更改的 id 属性

来自分类Dev

C#,具有许多时序逻辑的少数任务或具有很少时序逻辑的许多任务?

来自分类Dev

具有动态变量的Ansible循环任务

来自分类Dev

在具有并行任务的Mono / C#中无法释放内存。如何解释分配?

来自分类Dev

具有C#后台任务的WinJS应用程序用于推送通知

来自分类Dev

是否在C#中分别维护两个具有相同名称的任务?

来自分类Dev

具有Task.WhenAll()的C#异步任务不起作用

来自分类Dev

具有异步任务函数的线程 C#/.NET / await 未编译

来自分类Dev

具有动态对象的MongoDB C#驱动程序序列化

来自分类Dev

如何在RavenDB中存储具有动态属性的C#对象?

来自分类Dev

具有动态枚举字段的自定义Unity C#脚本编辑器

来自分类Dev

Blazor中具有C#代码的动态_Hosts.cshtml文件

来自分类Dev

C#初始化仅获取具有动态范围对象的列表属性

来自分类Dev

使用Webdriver C#选择具有动态ID的下拉元素

来自分类Dev

具有动态大小的C#中的字符串数组

来自分类Dev

从C#返回具有动态属性的JSON(UTC毫秒名称)

来自分类Dev

如何在RavenDB中存储具有动态属性的C#对象?

来自分类Dev

C# 动态方法 - 具有“Object”返回类型的字段 getter

来自分类Dev

c#中具有动态类型的运算符关键字

来自分类Dev

具有int属性的延迟加载Objective-C类

Related 相关文章

  1. 1

    具有动态延迟的C#任务

  2. 2

    c#并行For循环,具有微小延迟

  3. 3

    在C#中测量任务之间的延迟

  4. 4

    具有自定义任务的C#任务重写功能

  5. 5

    SSIS脚本任务C#编码可动态选择具有特定名称的最新Excel文件的第一张纸

  6. 6

    如何在C#中具有动态Nunit TestCaseSource?

  7. 7

    具有动态LINQ的C#布尔逻辑?

  8. 8

    具有继承类型的C#列表的动态实例

  9. 9

    在具有动态属性的linQ c#中进行过滤

  10. 10

    Selenium C# - FindElement 具有动态更改的 id 属性

  11. 11

    C#,具有许多时序逻辑的少数任务或具有很少时序逻辑的许多任务?

  12. 12

    具有动态变量的Ansible循环任务

  13. 13

    在具有并行任务的Mono / C#中无法释放内存。如何解释分配?

  14. 14

    具有C#后台任务的WinJS应用程序用于推送通知

  15. 15

    是否在C#中分别维护两个具有相同名称的任务?

  16. 16

    具有Task.WhenAll()的C#异步任务不起作用

  17. 17

    具有异步任务函数的线程 C#/.NET / await 未编译

  18. 18

    具有动态对象的MongoDB C#驱动程序序列化

  19. 19

    如何在RavenDB中存储具有动态属性的C#对象?

  20. 20

    具有动态枚举字段的自定义Unity C#脚本编辑器

  21. 21

    Blazor中具有C#代码的动态_Hosts.cshtml文件

  22. 22

    C#初始化仅获取具有动态范围对象的列表属性

  23. 23

    使用Webdriver C#选择具有动态ID的下拉元素

  24. 24

    具有动态大小的C#中的字符串数组

  25. 25

    从C#返回具有动态属性的JSON(UTC毫秒名称)

  26. 26

    如何在RavenDB中存储具有动态属性的C#对象?

  27. 27

    C# 动态方法 - 具有“Object”返回类型的字段 getter

  28. 28

    c#中具有动态类型的运算符关键字

  29. 29

    具有int属性的延迟加载Objective-C类

热门标签

归档