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 个不同角色和超过 1000 个用户的 Web 环境中使用,哪个 [Broker] 场景将具有最佳扩展性。

注意:随意提出任何替代方法。

4

4 回答 4

5

您可以使用静态或实例类来搞乱线程。但是,正确处理线程的关键是确保两个线程不会尝试同时访问同一个资源。

对于静态类,根据定义,它周围只有一个副本,所有线程都需要很好地共享。

使用实例类,您可以为每个线程创建一个实例。如果您确保每个线程只访问它自己的实例,并且实例属性和方法不会反过来访问其他共享资源,那么它们应该是线程安全的。

就您而言,初始化后我看不到类中的任何更改。如果您确保以线程安全的方式初始化静态类(这里似乎是这种情况),则静态变体应该是线程安全的(因为对变量的只读访问)并且会更快一些,因为您没有创建和处置实例的开销。

于 2010-04-19T16:24:26.930 回答
2

这两种方法都有自己的问题。我通常的方法是使用实​​例类(因为它们也更容易测试),但如果你想要每个线程的数据,你可以定义该类的静态实例。无论如何,如果要共享您的数据,您可能需要调查ReaderWriterLockSlim

于 2010-04-19T16:30:44.300 回答
1

实例类会更加线程安全,因为每个线程每个线程可以有一个副本,另一方面,静态类只能有一个,因此如果您需要线程共享数据,请确保实现某种锁定机制以便它们发挥作用彼此很好。还要指定您需要速度或资源消耗的效率环境。

于 2010-04-19T16:33:42.880 回答
0

没有绝对更多线程安全的选择,如果你不打算访问共享数据,没有区别,如果你是,仍然没有区别,但是静态类更有可能使用共享数据,因为它们是静态的,对他们来说几乎所有东西都是共享的。所以使用即时课程。正如 Martin Fowler 的 Singleton 模式,即使你想要静态的东西,最好将其设为单例,因为它更灵活。

于 2013-02-05T11:46:35.733 回答