相关疑难解决方法(0)

在C#中访问变量是一个原子操作吗?

我已经被认为如果多个线程可以访问变量,那么所有对该变量的读取和写入都必须受到同步代码的保护,例如"lock"语句,因为处理器可能会在中途切换到另一个线程写.

但是,我正在使用Reflector查看System.Web.Security.Membership并找到如下代码:

public static class Membership
{
    private static bool s_Initialized = false;
    private static object s_lock = new object();
    private static MembershipProvider s_Provider;

    public static MembershipProvider Provider
    {
        get
        {
            Initialize();
            return s_Provider;
        }
    }

    private static void Initialize()
    {
        if (s_Initialized)
            return;

        lock(s_lock)
        {
            if (s_Initialized)
                return;

            // Perform initialization...
            s_Initialized = true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么s_Initialized字段在锁外读取?另一个线程难道不能同时写入它吗?变量的读写是否是原子的?

c# multithreading

63
推荐指数
4
解决办法
2万
查看次数

延迟加载 - 最好的方法是什么?

我看过很多懒加载的例子 - 你有什么选择?

给定一个模型类,例如:

public class Person
{
    private IList<Child> _children;
    public IList<Child> Children
    {
        get {
            if (_children == null)
                LoadChildren();
            return _children;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Person类不应该知道它是如何被装载的......或者它应该是什么?当然它应该控制何时填充属性?

您是否有一个将Person与其子集合耦合在一起的存储库,或者您是否会使用不同的方法,例如使用lazyload类 - 即便如此,我也不希望在我的模型体系结构中使用lazyload类模糊.

如果首先请求一个Person然后它的子节点(即在这个例子中不是延迟加载)或者以某种方式延迟加载,你将如何处理性能.

这一切都归结为个人选择吗?

c# architecture methodology coding-style lazy-loading

14
推荐指数
1
解决办法
7097
查看次数