1

コーディング:

int rownum = 1;

Parallel.ForEach(listofstaffuid.Cast<object>(), staffuid =>
{
string staffname = dbmanager.GetNameViaUserID(staffuid.ToString());
staffdr = staffdt.NewRow();
staffdr["No"] = rownum;
staffdr["StaffName"] = staffname;
staffdr["RadioList"] = listofradio;
staffdr["RemarkTbx"] = string.Empty;
staffdt.Rows.Add(staffdr);
rownum++;

});

arraylistで見つけたdatatable foreachリストを追加したいだけです。すでにデータ行があるため追加できないというこのエラーがあります。私は今立ち往生しています、誰かが私を助けることができます.

4

3 に答える 3

2

行カウンターという共有リソースがあります。共有リソースへのアクセスを同期する必要があります。一方、データテーブルは書き込み操作に対してスレッドセーフではありません。したがって、データテーブルへのアクセスも同期する必要があります。

同期する必要のない唯一のもの (おそらく、それを見つけるのはあなたの部分です) は、GetNameViaUserID 関数です。その機能は時間がかかりますか?その場合は、この関数からすべての結果を並行して取得し、その結果を使用して後でデータテーブルを順番に埋めることを試みる価値があるかもしれません。まったく時間がかからない場合、コードブロック全体を同期する必要があるため、ここでは並列処理を使用しても意味がありません。つまり、foreach はとにかくシーケンシャルになります。

于 2013-02-23T08:05:56.787 に答える
0

それ以外の

staffdr = staffdt.NewRow();

使用する

var staffdr = staffdt.NewRow();

また、並列処理のため、rownumは正しくありません

于 2013-02-23T08:01:19.537 に答える
0

Parallel.X 内でカウンターを使用する場合は、カウンターをインクリメントするスレッドセーフな方法 (Interlock.Increment など) を使用する必要があります。

また、Parallel 操作の外部で定義されたフィールドまたは変数を使用している場合、競合状態が発生しています。Parallel 操作の外界への依存を常に少なくするようにしてください (少なくとも書き込みの観点から、または Concurrent オブジェクト (ConcurrentBag ...) を利用するという観点から)。

于 2013-02-23T08:06:44.207 に答える