如何将多线程应用于方法

Posted

技术标签:

【中文标题】如何将多线程应用于方法【英文标题】:how to apply multi threading to a method 【发布时间】:2020-05-07 18:53:46 【问题描述】:

我有一个程序可以让用户 int 输入“1”并根据目录中的文件数量递增它,然后在每个文件上标记该 int(首先是 1,依此类推 1++)。每个目录中的 foreach 循环获取其文件,递增输入并调用 stamp 方法,直到所有文件完成。在这个过程中,顺序很重要。然而,多任务处理(Parallel.ForEach)并不总是保证顺序,据我了解,它会返回先完成的线程,并且可能还会损坏 i++ 功能(如果我错了,请纠正我)。

问题是在这种情况下如何应用多线程?我正在考虑在最后保存 foreach 的值,将其传递给标记方法,并让方法一次标记 x 个文件。我不知道是否可以或如何申请。

这是我的水印方法:

//text comes from the foreach already set.
  public void waterMark(string text, string sourcePath, string destinationPathh)
        
            using (Bitmap bitmap = new Bitmap(sourcePath))
            
                //somecode
                using (Graphics graphics = Graphics.FromImage(tempBitmap))
                
                   //somecode
                   tempBitmap.Save(destinationPathh, ImageFormat.Tiff);
                  //Erroe^: a generic error occurred in gdi+
                 //I think due to trying to save multiple files at once
                
            
        

foreach 循环:

var files = folder.GetFiles();
 Parallel.ForEach(files, new ParallelOptions  MaxDegreeOfParallelism = 4 , (file, state,indexer) =>
                
//somecode that calls the waterMark method in multiple spots as of now
);

提前谢谢你。

【问题讨论】:

另见:Read and process files in parallel C#。有Parallel.For Method 方法给你一个索引。 【参考方案1】:

有一个overload of Parallel.ForEach 也为正在处理的项目提供索引:

Parallel.ForEach(someEnumerable, (val, state, idx) => Console.WriteLine(idx))

您可以使用它以线程安全的方式跟踪索引。

至于 GDI+ 的东西 (Bitmap),我认为只要您使用单个线程与位图进行所有交互就可以了。不要试图在实例化和处置之间对 async 做任何聪明的事情。

【讨论】:

@CountLessQ 不...我不会在您的开发过程中提供支持。您遇到了明确的错误消息。是时候写一个关于该错误消息的更集中的问题了。变色龙问题通常对后续读者没什么用处。 @CountLessQ 写完问题后请随时联系我...不过我不知道我会有多大用处。使用 GDI+ 进行批量图像操作时,我从来没有运气好过。 我认为同样的问题/问题仍然适用。如前所述,在操作文件时使用了多线程,谢谢您的帮助。

以上是关于如何将多线程应用于方法的主要内容,如果未能解决你的问题,请参考以下文章

将多线程 Delphi 应用程序移植到 Mac:我的选择是啥?

Java-将多线程停止的两种方法

将多线程合并到 C++ 中如何提高性能,为啥?

将多线程或异步添加到 Web 抓取

将多线程输出保存到txt文件

将多线程和多处理与 concurrent.futures 相结合