【问题标题】:C# run method multiple time concurrentlyC#同时多次运行方法
【发布时间】:2015-10-15 16:33:06
【问题描述】:

我有以下 C# 代码:

string[] files = Directory.GetFiles(@"C:\Users\Documents\DailyData", "*.txt", SearchOption.AllDirectories);

        for (int ii = 0; ii < files.Length; ii++)
        {
            perFile(files[ii]);
        }

where per file 打开每个文件并创建一系列通用列表,然后将结果写入文件。

每次迭代大约需要 15 分钟。

我希望perFile 方法同时执行,例如在开始下一个迭代之前不要等待当前迭代完成。

我的问题是:

我该怎么做?

如何控制perFile 的实例同时运行的数量

如何确定我的计算机一次可以处理多少个perFile 并发实例

【问题讨论】:

  • 您正在寻找的东西是可能的,但您不会从中获得任何好处,因为您的硬盘不会同时读取多个扇区。如果您有 ssd,您可能会受益。
  • @M.kazem Akhgary:我们无法从问题中判断perFile 方法是否是磁盘绑定的。 (显然发生了一定数量的磁盘 i/o,但无法知道这是否是瓶颈。)

标签: c# multithreading concurrency


【解决方案1】:

尝试使用Parallel.ForEach。您可以使用ParallelOptions.MaxDegreeOfParallelism 属性设置运行perFile 的最大计数。

【讨论】:

    【解决方案2】:

    如果您使用的是 .Net 4.5 及更高版本,您可以使用 Parallel.For 来做您需要的事情,您可以通过提供 ParallelOptions 并将 MaxDegreeOfParalleism 设置为您喜欢的数字来控制要使用的线程数。

    示例代码:

    ParallelOptions POptions = new ParallelOptions();
    POptions.MaxDegreeOfParalleism = ReplaceThisWithSomeNumber;
    
    Parallel.For(0,files.Length,POptions,(x) => {perFile(files[x]);});
    

    请注意,您的程序将受 IO 限制(请阅读 Asynchronous IO 了解有关如何解决该问题的更多信息)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多