c#任务中的私有变量
本文关键字:变量 任务 | 更新日期: 2023-09-27 18:16:14
我有一个转换JPG文件的代码。我用任务来加快速度。它是更快,但它搅乱了图像和他们的日期。对我来说,这就像变量在不同的线程之间共享,这使得图像中的变量用于循环中的下一个/另一个图像。是否有办法确保循环中的所有变量在当前任务/线程中都是私有的?
下面是我的代码:int intImageW, intImageH, intImageWtmp;
DateTime creationTime, lastWriteTime, lastAccessTime;
Parallel.ForEach(strarrFileList, strJPGImagePath =>
{
Bitmap bmpDest = new Bitmap(1, 1);
creationTime = File.GetCreationTime(strJPGImagePath);
lastWriteTime = File.GetLastWriteTime(strJPGImagePath);
lastAccessTime = File.GetLastAccessTime(strJPGImagePath);
using (Bitmap bmpOrig = new Bitmap(strJPGImagePath))
{
//Bitmap bmpOrig = new Bitmap(strJPGImagePath);
intImageW = bmpOrig.Width;
intImageH = bmpOrig.Height;
if ((intImageW > intImageH) && (intImageW > intLongSide))
{
intImageH = (int)((double)intImageH / ((double)intImageW / (double)intLongSide));
intImageW = intLongSide;
}
else if ((intImageH > intImageW) && (intImageH > intLongSide))
{
intImageW = (int)((double)intImageW / ((double)intImageH / (double)intLongSide));
intImageH = intLongSide;
}
else if ((intImageH == intImageW) && (intImageW > intLongSide))
{
intImageH = intLongSide;
intImageW = intLongSide;
}
else
{
// do something
}
// FIX THE ORIENTATION
if (Array.IndexOf(bmpOrig.PropertyIdList, 274) > -1)
{
var orientation = (int)bmpOrig.GetPropertyItem(274).Value[0];
switch (orientation)
{
case 1:
// No rotation required.
break;
case 2:
bmpOrig.RotateFlip(RotateFlipType.RotateNoneFlipX);
break;
case 3:
bmpOrig.RotateFlip(RotateFlipType.Rotate180FlipNone);
break;
case 4:
bmpOrig.RotateFlip(RotateFlipType.Rotate180FlipX);
break;
case 5:
bmpOrig.RotateFlip(RotateFlipType.Rotate90FlipX);
break;
case 6:
bmpOrig.RotateFlip(RotateFlipType.Rotate90FlipNone);
intImageWtmp = intImageW;
intImageW = intImageH;
intImageH = intImageWtmp;
break;
case 7:
bmpOrig.RotateFlip(RotateFlipType.Rotate270FlipX);
break;
case 8:
bmpOrig.RotateFlip(RotateFlipType.Rotate270FlipNone);
break;
}
bmpOrig.RemovePropertyItem(274);
}
bmpDest = new Bitmap(bmpOrig, new Size(intImageW, intImageH));
}
bmpDest.Save(strJPGImagePath, jgpEncoder, myEncoderParameters);
bmpDest.Dispose();
GC.Collect(2, GCCollectionMode.Forced);
File.SetCreationTime(strJPGImagePath, creationTime);
File.SetLastWriteTime(strJPGImagePath, lastWriteTime);
File.SetLastAccessTime(strJPGImagePath, lastAccessTime);
});
问题来自这些变量:
您声明了一组变量,并同时在所有线程中使用它们。
这是行不通的。
相反,您需要在lambda表达式内声明变量,以便每个任务获得自己的变量。