使用BlockingCollection和parallel . invoke为并行执行优化缓冲样本
本文关键字:并行执行 优化 缓冲 样本 invoke BlockingCollection parallel 使用 | 更新日期: 2023-09-27 17:54:13
在为并行执行优化缓冲样本的基础上,出现了这个问题。
简而言之:这段代码抛出了很多不能访问其他线程元素的异常。它创建空文件名并跳过每3个左右的数字。
目标是在并行将字节数组转换为图像时不要混淆编号(Nummerierung)。详情请参考链接
我需要改变什么?
Action action = () =>
{
ArrayAnsammlung.TryTake(out data);
if (data != null)
{
Nummerierung = Convert.ToString(Interlocked.Increment(ref Nummerierungszaehler));
Enkodierung = null;
Enkodierung = new JpegBitmapEncoder();
Enkodierung.FlipHorizontal = true;
var dateiStrom = new FileStream("E:''Temp''" + datum + " " + Nummerierung.PadLeft(12, '0') + ".jpg", FileMode.Create);
Enkodierung.Frames.Add(BitmapFrame.Create(BitmapSource.Create(bildbreite, bildhoehe * 2,
96, 96, PixelFormats.Bgr32, null, data, stride)));
Enkodierung.Save(dateiStrom);
dateiStrom = null;
Enkodierung = null;
}
};
while (aufnahme)
{
try
{
Parallel.Invoke(action, action, action, action, action);
}
catch (AggregateException oo)
{
Console.WriteLine(oo.ToString());
}
Thread.Sleep(2000);
}
为Nummerierung使用本地字符串,为Enkodierung使用本地变量,因为这两个变量在线程之间共享,如果另一个线程开始执行,一个线程的Nummerierung和Enkodierung可能会被覆盖。