2

public static クラスには、次のローカル メソッドがあります。

private static int GetMaxFromList(IEnumerable<int> list)
    {
        var result = 0;

        foreach (var i in list)
        {
            if (i > result) result = i;
        }

        return result;
    }

このメソッドは、クラス内のいくつかのパブリック メソッドによって呼び出されます (例)。

public static bool IsIntegrityOfDataSetGood(DataSet dataSet, KeyValuePair<string, List<int>> tableAndColumnIndexes)
    {
        return IsIntegrityOfDataSetGood(dataSet, tableAndColumnIndexes.Key) &&
               dataSet.Tables[tableAndColumnIndexes.Key].Columns.Count > GetMaxFromList(tableAndColumnIndexes.Value);
    }

このパブリック メソッドは、クラス内の別のパブリック メソッドも呼び出すことに注意してください。

クラス メソッドは、パラメーターを介して送信されたデータのみを処理しますが、静的メソッド間の呼び出しがスレッド セーフを台無しにするのではないかと心配しています。私が心配するのは正しいですか?

このコードが .NET 2.0 プロジェクトに存在することを忘れていました。

4

2 に答える 2

4

いいえ、これはスレッドセーフを損なうことはありません。

しかし、それが本当にスレッドセーフであるかどうかは、どこtableAndColumnIndexesから来て、他のどのスレッドがそれにアクセスできるかによって異なります。つまり、呼び出しコードに依存します。

于 2012-04-13T07:26:53.737 に答える
3

list他のスレッドがシーケンスを変更していない限り、まったく問題ありません。共有状態にはアクセスせず、パラメーターを使用するだけです。他のスレッドシーケンスを変更している場合は、InvalidOperationException.

スレッド セーフと静的メソッドについて誤解しているように思えますが、それらが何であるかを正確に伝えるのは難しいです... Eric Lippert のブログ記事「What is this thing you call thread safe?」を見つけることができます。使える。

于 2012-04-13T07:27:27.290 に答える