C # Thread Статические переменные - PullRequest
0 голосов
/ 17 марта 2011

У меня есть статический класс DataLibrary, который реализует шаблон синглтона.

        public static FacilityRepository FacilRepo
        {
            get
            {
                if (_facilRepo == null)
                {
                    _facilRepo = new FacilityRepository(Authenticated.UserId);
                    if (Authenticated.FacKey.Length > 0)
                    {
                        foreach (var fac in _facilRepo)
                            fac.IsSelected = (fac.FacilityKey == Authenticated.FacKey);                        
                    }
                }
                return _facilRepo;
            }
        }

private static FacilityRepository _facilRepo;

Когда я обращаюсь к этому из разных потоков с помощью Task.Factory.StartNew, FacilityReposity воссоздается несколько раз, как мне этого избежать.

Ответы [ 3 ]

9 голосов
/ 17 марта 2011

Я не думаю, что у вас на самом деле есть локальная переменная потока - у вас просто условие гонки, потому что вы не реализуете шаблон синглтона должным образом.

У меня есть страница о шаблоне синглтона , которая дает несколько лучших вариантов.(В частности, поскольку вы используете TPL, вы должны использовать .NET 4, поэтому опция Lazy<T> определенно является претендентом.)

1 голос
/ 17 марта 2011

Эта статья Джона Скита может быть полезна: Реализация шаблона Singleton в C #

Эти вопросы также могут быть полезны:

0 голосов
/ 17 марта 2011

Это произойдет, если несколько потоков впервые получат доступ к вашему свойству до инициализации _facilRepo. Вы должны заблокировать код инициализации следующим образом:

private static object _facilRepoLock = new object();
public static FacilityRepository FacilRepo
{
    get
    {
        if (_facilRepo == null)
        {
            lock (_facilRepoLock)
            {
                if (_facilRepo == null)
                {
                    _facilRepo = new FacilityRepository(Authenticated.UserId);
                    if (Authenticated.FacKey.Length > 0)
                    {
                        foreach (var fac in _facilRepo)
                            fac.IsSelected = (fac.FacilityKey == Authenticated.FacKey);
                    }
                }
            }
        }
        return _facilRepo;
    }
}

private static FacilityRepository _facilRepo;
...