【问题标题】:C# new Task clarificationC#新任务说明
【发布时间】:2020-08-09 04:23:49
【问题描述】:

在阅读了不同年份发表的多篇文章后,我比以前更加困惑。

我想知道如何确保我创建的任务能够在多个内核上运行??

下面的函数必须处理大量上传到服务器的文件:

private void FileSystemWatcher_Created(object sender, System.IO.FileSystemEventArgs e)
    {

        var SyncTask = new Task(() => 
        {

            //DO A LOT OF WORK HERE
        });

        SyncTask.Start();

    }

如果这是否是 4.7.2 .NET 框架的方法,我只是找不到一个直接的答案?

【问题讨论】:

  • 推荐使用Task.Run。另请参阅Task constructor documentation,其中指出使用构造函数仅适用于需要分离任务设置和启动的高级场景,这种情况极为罕见。你也应该等待你的任务。
  • 任务将在线程池上运行,它管理如何运行任务以及使用哪个线程
  • 好的,如果需要,线程池是否会分配任务在多个内核上运行?
  • 通常使用Task.Run() 你可能不关心核心。但是您可以设置 LongRunning 选项来强制创建新的线程。还有一个选项可以考虑使用async/await。这是通过节省线程资源来完成这项工作的方法。是的,它可能使用多个内核。要走的路:转到 .NET Core 3.1。
  • 谢谢,我用 Windows 资源监视器测试了 Task.Run(),我可以清楚地看到工作负载通过使用 Task.Run() 平均分布在所有内核中

标签: c# multithreading task-parallel-library multitasking


【解决方案1】:

任务本身将在单个核心上运行。如果您希望“//在这里做很多工作”在多个内核上运行,您需要通过从该任务生成任务来并行化该工作(另请参阅Child tasks,或使用更简单的Parallel

否则,无论您是使用您的方法还是仅使用Task.Run(..),这对您的情况并不重要。

编辑article,它很好地解释了不同之处。

【讨论】:

    猜你喜欢
    • 2013-07-26
    • 2016-09-25
    • 2018-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多