私はConcurrentBagコレクションを持っています。この中のすべてのアイテムについて、私はいくつかの作業を行うためのタスクを行います。スレッドセーフですconcurrentbagを使ってタスクを作成します
私は、ConcurrentBagを持つParallel.ForEachはスレッドセーフであることを知っていますが、私はこのように並列性を決して行っていません。
私のコードは、このコードは、スレッドセーフであるので、この
public void Work(IList<MyModel> data)
{
var tasks = new ConcurrentBag<Task>();
var safeData = new ConcurrentBag<MyModel>(data);
foreach (var item in safeData)
{
var task = Task.Factory.StartNew(() => SomeTask(item));
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
}
のように見えますか?
おかげで
EDIT: たぶん、この質問は次のようになります。「アイテム」は、スレッドセーフであるだろうか、反復間の彼の値を変更することができますか?
EDIT 2: このコードがこの範囲に入るかどうかは、problemです。
編集3:彼はループ変数と直接連携する場合、このquestionで 、「Wonko SANEは、」問題を抱えています。この問題はConcurrentBagを使って修正できると思っていましたが、いくつかの答えでは、私はConcurrentBagがまったく必要ないと教えてください。したがって:
ループ変数を直接使用するのは良い考えですか?
この値を別の変数にコピーしますか?
ConcurrentBagのループ変数で直接作業するのは安全ですか?
このシングルスレッドコードのどの部分に問題があると思われますか? ( 'SomeTask(item)'を別々のスレッドで実行している部分は無視します。おそらくスレッドセーフです)。 –
あなたは閉鎖について尋ねていますか?あなたは2番目の質問の文言についての説明を提供できますか? – Kote
tasksとsafeDataのコレクションは、* one *スレッドのみが使用します。したがって、常にスレッドセーフであり、ConcurrentBagを使用する点はありません。データ要素上のスレッドは、スニペットからスレッドセーフな方法でそれらのオブジェクトが使用されているかどうかを判断する方法はありません。それぞれのスレッドが別個の要素を扱うためにうまくいく傾向にありますが、要素が同じオブジェクトへのオブジェクト参照を持ち、ワーカースレッドが要素を変更すると問題が発生します。 –