如何将多线程应用于方法
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+ 进行批量图像操作时,我从来没有运气好过。 我认为同样的问题/问题仍然适用。如前所述,在操作文件时使用了多线程,谢谢您的帮助。以上是关于如何将多线程应用于方法的主要内容,如果未能解决你的问题,请参考以下文章