最近、作業項目の処理に非常に基本的なアプローチを使用するシステムを継承しました。正直言って、最近までこれはうまくいきました。しかし、我々は別のタイプの作業項目のための同様のプロセスを実装しようとしており、私は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のインスタンスの可能性は、いくつかのデータ整合性の問題を引き起こす可能性があります。例えば、ProcessWorkItemDataProcess2
はWorkItem1.Data
と呼ばれ、その後WorkItem2.Data
と呼ばれ、何とかWorkItem2.Data
はそれがWorkItem1.Data
静的メソッドのすべてが自己完結型のこれまでのところ、彼らは意志だけ(のロジックを定義しているようであるべきであるときに返されます理論)は、それが呼び出されたWorkItem
を使用します。 DBアクセス、ファイルアクセスなどの方法はありません。
これはうまくいけば私がやっていることを説明します。何か心配がありますか?その場合は、各WorkItemのProcessor
クラスのインスタンスを作成して潜在的な問題を解決しますか?あなたが共有状態にアクセスする複数のスレッドを持っていると、少なくとも1つが書いている場合は一言で言えば、事前
私にとって合理的に安全ですが、コンカレントコードでは悪魔は常に細部にいます。あなたが話している正確なコードを精査することなく、誰もが決定的な助言を与えることは不可能です。 – LukeH
あなたはどんな種類のものを探しますか? – ChrisBint