通常のforループをParallel.Forループに変えたいと思っていました。 this-入れ子になったParallel.Forループ内の同期
Parallel.For(0, bitmapImage.Width - 1, i =>
{
Parallel.For(0, bitmapImage.Height - 1, x =>
{
System.Drawing.Color oc = bitmapImage.GetPixel(i, x);
int gray = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
System.Drawing.Color nc = System.Drawing.Color.FromArgb(oc.A, gray, gray, gray);
bitmapImage.SetPixel(i, x, nc);
});
});
の中へ
This-
for (int i = 0; i < bitmapImage.Width; i++)
{
for (int x = 0; x < bitmapImage.Height; x++)
{
System.Drawing.Color oc = bitmapImage.GetPixel(i, x);
int gray = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
System.Drawing.Color nc = System.Drawing.Color.FromArgb(oc.A, gray, gray, gray);
bitmapImage.SetPixel(i, x, nc);
}
}
message-
オブジェクトが別の場所で現在使用中であるとそれは失敗します。
以下の行は、複数のスレッドがスレッドセーフではないソースにアクセスしようとしているためです。どのように私はこの作品を作ることができる任意のアイデア?
System.Drawing.Color oc = bitmapImage.GetPixel(i, x);
リソースを同時に読み取ったり変更したりすることはできません。あなたの最初のバージョンが動作する唯一のバージョンです。ロックを追加するとオーバーヘッドが増え、最初のバージョンよりも遅くなります。 – Igor
@Igorありがとうございます。私は同じと思った。 –
ImageはGUI関連のクラスであるため、シングルスレッドアクセス用に作成されています。あなたはスタンドアローンのmatriceで計算を行い、その後はsingle forループでイメージを更新しようとするかもしれません。 – VMAtm