簡體   English   中英

尋找有關使用 static 方法“處理” class 實例的線程安全的建議

[英]Looking for advice on thread safety using static methods to 'process' a class instance

我最近繼承了一個系統,它使用一種非常基本的方法來處理工作項,基本上,它一個一個地處理它們。 老實說,直到最近這還不錯。 但是,我們正在尋求為另一種類型的工作項實施類似的流程,我一直在研究任務並行庫,並認為這符合要求。 但是,我對線程安全有些擔憂,老實說,這是我缺乏知識的領域,所以我在這里只問我的第二個問題,希望有人能給我一些好處,因為我還沒有找到對此的明確是或否答案。

所以我們有我們的'WorkItem' class

public class WorkItem
{
    public int Id {get; set;}
    public string data { get; set;}
}

將生成一個List<WorkItem> ,然后使用Parallel.Foreach循環處理這些。

Parallel.Foreach將調用一個私有方法,該方法又會從另一個程序集調用 static 方法;

//Windows service that will run the Parallel.Foreach
private int MainMethod(WorkItem item) 
{
    item.Data = Processor.ProcessWorkItemDataProcess1(item.data);
    item.Data = Processor.ProcessWorkItemDataProcess2(item.data);
    SendToWorkFlow(item);
}


public static class Processor
{
    public static string ProcessWorkItemDataProcess1(string data)
    {
    //Process it here
    return string
    }

    public static string ProcessWorkItemDataProcess2(string data)
    {
        //Process it here
        return string
    }
}

等等。 所有這些方法都包含在各個不同階段處理 WorkItem 實例的邏輯。 完成后, MainMethod會將處理后的 WorkItem 發送到 Workflow System。

我們將分批處理這些,最多 30 個,以免其他系統過載。 我的擔心基本上是 30 個WorkItem實例訪問相同的 static 方法可能會導致一些數據完整性問題。 例如,使用WorkItem1.Data調用ProcessWorkItemDataProcess2並隨后使用WorkItem2.Data調用,並且當它應該是WorkItem2.Data時以某種方式返回WorkItem1.Data

所有 static 方法都是自包含的,只要它們定義了邏輯並且只會(理論上)使用調用它的WorkItem 沒有數據庫訪問、文件訪問等方法。

所以,希望這能解釋我在做什么。 我應該有什么顧慮嗎? 如果是這樣,為每個 WorkItem 創建一個Processor class 的實例會解決任何潛在問題嗎?

提前致謝

您描述的場景聽起來沒有任何明顯的線程問題。 您擔心在兩個不同的線程上調用 static 方法並將數據混淆是沒有根據的,除非您編寫代碼來混淆。 ;>

由於這些方法是 static,因此它們不需要擔心任何共享的 object 實例。 那挺好的。 您已將工作隔離為獨立的工作項。 那很好。

您需要檢查以確保沒有 static 方法訪問任何全局 state,例如 static 變量或屬性,或從文件中讀取多個工作項(相同的文件名)。 全局 state 的讀取不那么令人擔憂,而寫入才是工作中的關鍵。

您還應該查看您的代碼,以了解如何將數據分配給您的工作項,以及處理工作項的任何代碼是否修改了工作項數據。 如果工作項被方法嚴格地視為只讀,那很好。 如果方法將更改寫回工作項的字段或屬性,您將需要仔細檢查工作項中的數據是否未與任何其他工作項共享。 如果構造工作項實例的代碼將緩存值分配給多個工作項的屬性,並且 static 方法修改該值的屬性,您將遇到線程沖突。 如果工作項構造總是構造分配給工作項屬性的值的新實例,那么這應該不是問題。

簡而言之,如果您有多個線程訪問共享 state,並且至少有一個正在寫入,那么您需要擔心線程安全。 如果沒有,那么你就是金子。

暫無
暫無

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

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