2014-12-24 57 views
0

請幫我理解c#中鎖的流程。 帶有方法的類正在不斷地由兩個不同的線程週期性地調用。理解c中的鎖#

class DataRetriever 
{ 
    BaseUrl="..."; 
    public static void _Fetch(<list<dataInformation> quote) 
    { 
     XDocument doc=XDocument.Load(BaseUrl); 
     parse(quote,doc); 
    } 

    private static void Parse(List<dataInformation> quotes, XDocument doc) 
    { 
     // some statement 
    } 
} 

// dataInformation is a class here 

現在的問題是...... 1.是否有在不在需要任何鎖語句如果_Fetch()方法是由兩個或更多的線程調用定期。如果是,請告訴我爲什麼以及如何?我想了解鎖定流程。 2.爲什麼我們使用對象被鎖定?

我在這裏試圖

class DataRetriever 
{ 
    BaseUrl="..."; 

    object obj=new object() 
    public static void _Fetch(<list<dataInformation> quote) 
    { 
     lock(obj) // giving error obj is not accepting here 
     { 
     XDocument doc=XDocument.Load(BaseUrl); 
     parse(quote,doc); 
     } 
    } 

    private static void Parse(List<dataInformation> quotes, XDocument doc) 
    { 
     // some statement 
    } 
} 

也試圖解決

class DataRetriever 
{ 
    BaseUrl="..."; 

    public static void _Fetch(<list<dataInformation> quote) 
    { 
     lock(this) // giving error this is not accepting 
     { 
     XDocument doc=XDocument.Load(BaseUrl); 
     parse(quote,doc); 
     } 
    } 

    private static void Parse(List<dataInformation> quotes, XDocument doc) 
    { 
     // some statement 
    } 
} 

做要緊。請儘可能提供一些有用的鏈接。 關於

+0

鎖是不是在你的情況需要爲您不分享你的線程之間的任何狀態。 –

+0

這是一個靜態方法..我剛剛刪除它並創建它現在正在接受的實例方法。 – user3248647

+0

謝謝@Tien Dinh ..你能給我一些關於這個的鏈接嗎? – user3248647

回答

0

這是正確的,但你應該真正注意防止編譯的錯誤。

你的對象obj = new object();失蹤了;

class DataRetriever 
{ 
    BaseUrl="..."; 

    object obj=new object(); 
    public void _Fetch(<list<dataInformation> quote) 
    { 
     lock(obj) // giving error obj is not accepting here 
     { 
     XDocument doc=XDocument.Load(BaseUrl); 
     parse(quote,doc); 
     } 
    } 

    private void Parse(List<dataInformation> quotes, XDocument doc) 
    { 
     // some statement 
    } 
} 

如下所述,您還可以使用靜態方法的實例化字段。我只是將方法改爲非靜態方法。

+1

這不是問題所在。 OP使用靜態方法中的實例字段。 –

+0

謝謝,我甚至沒有注意到這一點。我會更新以反映更改。 – deathismyfriend

0

,因爲你試圖使用this反映你的類型的靜態方法,屬於你的類型,而不是你的實例內當前實例您收到一個錯誤。

非靜態類的靜態方法將導致只有靜態字段通過靜態構造函數(如果存在)或通過字段初始化進行初始化。這就是爲什麼你的方法中不允許使用this

替代方案可能是爲鎖創建一個靜態字段。請注意,這將意味着此鎖對象將在您班級的所有實例中共享。

public static object _lock = new object(); 

然後:

lock(_lock) 
{ 
    XDocument doc=XDocument.Load(BaseUrl); 
    parse(quote,doc); 
} 
+0

謝謝但是,另一個問題是這個鎖需要在這裏或沒有? – user3248647

+0

目前,我不可能知道這一點。這取決於你的'Parse'方法的作用,線程如何訪問你的代碼等。 –

+0

解析方法在這裏只是一個linq到xml查詢。用foreach循環。 _Fetch方法在兩個不同的類和線程中被兩個不同的方法同時調用。 – user3248647