2011-06-29 10 views
2

最近、作業項目の処理に非常に基本的なアプローチを使用するシステムを継承しました。正直言って、最近までこれはうまくいきました。しかし、我々は別のタイプの作業項目のための同様のプロセスを実装しようとしており、私はTask Parallel Libraryを検討しており、それがこの法案に適合すると思っています。しかし、私は糸の安全性について懸念しています。正直言って、これは知識が不足している領域なので、まだ私が見つけていないので、誰かが私に良い点を与えてくれることを願って、このための決定的なイエスまたはノーの答え。静的メソッドを使用してクラスインスタンスを処理するスレッドの安全性に関するアドバイスを探す

だから我々はList<WorkItem>が生成され、これらは、その後Parallel.Foreachループを使用して処理されます

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

たちの「作業項目」クラスを持っています。

Parallel.Foreachはプライベートメソッドを呼び出すため、別のアセンブリから静的メソッドが呼び出されます。

//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をワークフローシステムに送ります。

他のシステムに過度の負荷がかからないように、最大​​30個のバッチで処理します。私の懸念は、基本的に同じ静的メソッドにアクセスするWorkItemの30のインスタンスの可能性は、いくつかのデータ整合性の問題を引き起こす可能性があります。例えば、ProcessWorkItemDataProcess2WorkItem1.Dataと呼ばれ、その後WorkItem2.Dataと呼ばれ、何とかWorkItem2.DataはそれがWorkItem1.Data

静的メソッドのすべてが自己完結型のこれまでのところ、彼らは意志だけ(のロジックを定義しているようであるべきであるときに返されます理論)は、それが呼び出されたWorkItemを使用します。 DBアクセス、ファイルアクセスなどの方法はありません。

これはうまくいけば私がやっていることを説明します。何か心配がありますか?その場合は、各WorkItemのProcessorクラスのインスタンスを作成して潜在的な問題を解決しますか?あなたが共有状態にアクセスする複数のスレッドを持っていると、少なくとも1つが書いている場合は一言で言えば、事前

+0

私にとって合理的に安全ですが、コンカレントコードでは悪魔は常に細部にいます。あなたが話している正確なコードを精査することなく、誰もが決定的な助言を与えることは不可能です。 – LukeH

+0

あなたはどんな種類のものを探しますか? – ChrisBint

答えて

3

あなたが説明したシナリオは、まったくのスレッド問題があるようには聞こえません。 2つの異なるスレッドで静的メソッドが呼び出され、データが混在する心配はありません。 ;>

メソッドは静的なので、心配する共有オブジェクトインスタンスはありません。それは良い。あなたは自作の作業項目に作業を分離しました。それはいいです。

スタティック変数やプロパティなどのグローバルステートにアクセスするスタティックメソッドや、複数のワークアイテムの同じファイル名から読み込むスタティックメソッドがないことを確認する必要があります。グローバルな状態の読書は心配されていませんが、書くことは作品にレンチを投げるものです。

また、コードを確認して、作業項目にデータがどのように割り当てられているか、作業項目を処理するコードが作業項目データを変更するかどうかを確認する必要があります。作業項目がメソッドによって厳密にのみ読み込まれたものとして扱われている場合、それは良いことです。メソッドがワークアイテムのフィールドまたはプロパティに変更を書き戻す場合は、ワークアイテム内のデータが他のワークアイテムと共有されていないことを再度確認する必要があります。ワークアイテムインスタンスを構築するコードがキャッシュされた値を複数のワークアイテムのプロパティに割り当て、静的メソッドがその値のプロパティを変更すると、スレッドの競合が発生します。作業項目の構成が常に作業項目のプロパティに割り当てられた値の新しいインスタンスを構築する場合、これは問題ではありません。

2

おかげで、あなたは、スレッドの安全性を心配する必要があります。そうでなければ、あなたは金色です。

+0

申し訳ありませんが、あなたは '共有状態'を定義できますか?各静的メソッドは、WorkItemからのデータを渡して返します。 – ChrisBint

+1

あなたの古典的な状態の例は変数です。 2つのスレッドが同時にアクセスすると共有されます。 –

+0

これは、プロセッサ内で宣言された静的変数か、静的メソッド自体の中のプライベート変数ですか? – ChrisBint

関連する問題