簡體   English   中英

C#線程靜態變量

[英]C# Thread Static Variables

我有一個靜態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會被重新創建多次,那么如何避免這種情況。

我不認為您實際上在這里沒有線程局部變量-您只是有競爭條件,因為您沒有正確實現單例模式。

我有一個關於單例模式頁面,它提供了一些更好的選擇。 (特別是,當您使用TPL時,必須使用.NET 4,因此Lazy<T>選項絕對是競爭者。)

喬恩·斯凱特(Jon Skeet)的這篇文章可能會有所幫助: 在C#中實現單例模式

這些問題可能也有幫助:

如果在_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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM