2

次の2つのシナリオを検討してください。

//Data Contract
public class MyValue
{
}

シナリオ1:静的ヘルパークラスを使用する。

public class Broker
{
    private string[] _userRoles;

    public Broker(string[] userRoles)
    {
        this._userRoles = userRoles;
    }

    public MyValue[] GetValues()
    {
        return BrokerHelper.GetValues(this._userRoles);
    }
}

static class BrokerHelper
{
    static Dictionary<string, MyValue> _values = new Dictionary<string, MyValue>();
    public static MyValue[] GetValues(string[] rolesAllowed)
    {
        return FilterForRoles(_values, rolesAllowed);
    }
}

シナリオ2:インスタンスクラスを使用する。

public class Broker
{
    private BrokerService _service;

    public Broker(params string[] userRoles)
    {
        this._service = new BrokerService(userRoles);
    }

    public MyValue[] GetValues()
    {
        return _service.GetValues();
    }
}

class BrokerService
{
    private Dictionary<string, MyValue> _values;
    private string[] _userRoles;

    public BrokerService(string[] userRoles)
    {
        this._userRoles = userRoles;
        this._values = new Dictionary<string, MyValue>();
    }

    public MyValue[] GetValues()
    {
        return FilterForRoles(_values, _userRoles);
    }
}

[ブローカー]シナリオのどれが、約100の異なる役割と1,000を超えるユーザーを持つWeb環境で使用された場合に最適に拡張されます。

注:別のアプローチを自由に提案してください。

4

4 に答える 4

5

静的クラスまたはインスタンスクラスのいずれかを使用して、スレッドを台無しにすることができます。ただし、スレッドを正しく取得するための鍵は、2つのスレッドが同時に同じリソースにアクセスしようとしないようにすることです。

静的クラスでは、定義上、すべてのスレッドが適切に共有する必要があるコピーは1つだけです。

インスタンスクラスを使用すると、スレッドごとに1つのインスタンスを作成できます。各スレッドがそれ自体のインスタンスにのみアクセスし、インスタンスのプロパティとメソッドが他の共有リソースにアクセスしないようにする場合は、スレッドセーフである必要があります。

あなたの場合、初期化後にクラスで何も変更されていないようです。静的クラスをスレッドセーフな方法で初期化することを確認した場合(ここではそうであるようです)、静的バリアントはスレッドセーフである必要があり(変数への読み取り専用アクセスのため)、インスタンスの作成と破棄のオーバーヘッド。

于 2010-04-19T16:24:26.930 に答える
2

どちらのアプローチにも独自の問題があります。私の通常のアプローチはインスタンスクラスを使用することですが(テストも簡単なため)、スレッドごとのデータが必要な場合は、そのクラスの静的インスタンスを定義できます。いずれにせよ、データを共有する場合は、おそらくクラスを調査するReaderWriterLockSlim必要があります。

于 2010-04-19T16:30:44.300 に答える
1

インスタンスクラスは、各スレッドがスレッドごとに1つのコピーを持つことができるため、スレッドセーフが高くなります。一方、静的クラスは1つしか持つことができないため、スレッドでデータを共有する必要がある場合は、何らかのロックメカニズムを実装して、それらが再生されるようにしてください。お互いにいい。また、速度またはリソース消費が必要な効率のコンテキストを指定します。

于 2010-04-19T16:33:42.880 に答える
0

スレッドセーフな選択は絶対にありません。共有データにアクセスしない場合でも違いはありません。アクセスする場合でも違いはありませんが、静的クラスは共有データを使用している可能性が高くなります。静的であり、それらのほとんどすべてが共有されます。したがって、インスタントクラスを使用します。Martin Fowlerのシングルトンパターンとして、静的なものが必要な場合でも、柔軟性が高いため、シングルトンにすることをお勧めします。

于 2013-02-05T11:46:35.733 に答える