2

私はアプリケーションを整えるのを手伝っています、そしてそれは並行性の問題でいっぱいです。私はそれらを処理しようとしていますが、DataTablesを使用しているセクションに出くわしました。

データテーブル自体は静的であり、多くのスレッド間で共有されます。

dt.Select( "...")を使用すること自体にロックステートメントが必要であることを知っています。そうしないと、データテーブルに行を追加/削除するときに問題が発生します。ただし、その呼び出しが返されると、DataRowオブジェクトの配列があります。

それらを更新する場合は明らかにそれらの行をロックしますが、それらを読んでいるだけの場合は、ロックする必要がありますか?

基本的に、他の場所で新しい行を追加し、既存の行を更新する可能性があることを考えると、次のうち正しいものは次のとおりです。

lock (dtLock)
{
    DataRow[] rows = dt.Select("...");
}
foreach(DataRow dr in rows)
{
    // read statements only
}

また

lock (dtLock)
{
    DataRow[] rows = dt.Select("...");

    foreach(DataRow dr in rows)
    {
        // read statements only
    }
}
4

1 に答える 1

1

既存の行を更新すると述べたので、から抽出した行へのアクセスをロックする以外に選択肢はありませんSelect。別のスレッドによって変更される可能性がある場合は、読み取りだけでも行にアクセスすることはできません(または少なくともそうすべきではありません)。さらに、個々の行にアクセスすると、基になる内部構造に触れる可能性があるため(そして、私自身も先祖の証拠を見てきました)、DataTable新しい行を追加しただけでも問題が発生する可能性があります。

于 2010-10-05T19:40:39.520 に答える