stevenjin 2024-12-06 11:49 采纳率: 95.5%
浏览 11
已结题

c#多任务执行优化方案

1.实现多个计划定时任务。任务个数上限为10个,可随时手动停止。
如任务A执行写入后,延时3秒,再刷新; 新任务可能在A任务执行过程中创建并开启。执行工作没有复杂耗时操作。
2.此类需求用一个task或valueTask实现好呢?是多个计划任务放到一个task运行?还是分多个task运行呢?不知多个内存占用如何,工控板内存有限。

  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    针对你的需求,以下是关于C#多任务执行优化的建议方案:

    1. 实现多个计划定时任务:
      • 可以使用 System.Timers.TimerSystem.Threading.Timer 来实现定时任务。使用 System.Timers.Timer 时,可以在 Elapsed 事件处理程序中定义任务逻辑。这些定时器创建简单,可以很好地管理多个定时任务。由于它们使用的是回调机制,所以不会阻塞主线程。
      • 对于任务个数上限为10个的要求,可以维护一个包含所有定时任务的列表,并允许手动停止特定的任务。定时任务启动和停止的操作需要特别注意线程同步问题,确保并发环境下的安全性。可以使用锁(lock)或信号量(Semaphore)来同步线程访问共享资源。
      • 由于工控板内存有限,你可以将任务的实现尽可能简洁并优化代码以最小化内存占用。如果不涉及到长时间或资源密集型操作,可以将多个计划任务放在一个进程或应用程序中运行。然而,如果你的任务是IO密集型或者并发量大到需要对任务进行分离的话,考虑将每个任务放入不同的进程中执行或使用异步编程模式来优化资源分配。

    关于使用 TaskValueTask 的选择:

    • 如果你希望代码具有异步特性并且不阻塞主线程,可以使用 TaskValueTask 来封装异步操作。这两者主要区别在于值类型与引用类型的差异和完成任务的等待机制(例如:非同步上下文的场景中使用 ValueTask 有一定的优势)。但如果任务是IO密集型且你关注的是避免任务本身的创建开销以及实现性能优化的任务分发,推荐使用 async/await 和原生的线程池支持而非自定义的 Task。在这种情况下,你的代码逻辑将更简单且更容易维护。此外,由于异步操作可以复用线程池中的线程,所以它在内存占用方面相对更有效率。但对于内存资源有限的场景来说,单个线程内的任务过多仍然有可能带来资源消耗的问题。所以在实现过程中还需特别注意对任务的数量进行管理,避免因内存溢出而导致的问题。在任务过多时可以考虑使用任务调度器(如 TaskScheduler)来管理任务的执行和调度策略。如果考虑到简化内存管理和任务调度的复杂性,可以采用分多个应用程序或进程的方式来执行这些任务,以减小单个进程的内存负担和复杂度。综上所述,使用单一任务或者多任务架构的选择需要根据具体的应用场景和性能要求来综合考虑和评估。总之设计时应综合考虑任务数量、资源占用、执行时间等因素进行决策和优化。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月8日
  • 已采纳回答 12月8日
  • 创建了问题 12月6日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部