1

こんにちは皆さん :) C# での並列処理と ms sql について質問があります

特定のオブジェクトの Db を調べるメソッドがあります。存在しない場合は、Db に追加されます。残念ながら、これは Parallel.ForEach で行われるため、スレッド A と B を使用していくつかの状況が発生しました。

A: コード 'xxx' を持つエンティティを探す - 結果: 存在しない B: コード 'xxx' を持つエンティティを探す - 結果: 存在しない A: エンティティを Db に追加する - 結果 OK B: エンティティを Db に追加する - 結果: "違反UNIQUE KEY 制約の (...) 重複するキーの値は 'xxx' です"

その状況を避けるために私は何をすべきですか?

4

1 に答える 1

0

この重複エラーがない場合は、ここでキャッチします

try{
    //execute you insert in base
}catch(Exception ex){
    // If your constraint is not respected, an error is thrown.
    console.WriteLine("db error : "+ex.Message);
}

だけど、一時的だ、機能的にはだけど悪い、まともじゃない…

適切なコードを作成するには、スプーラーを作成します。

class Spooler{
    public System.Collections.Generic.List<String> RequestList = new System.Collections.Generic.List<String>();

    public Spooler(){
        // Open you Database
        // Start you thread will be verify if a request adding in the collection
        SpoolThread = new Thread(new ThreadStart(SpoolerRunner));
        SpoolThread.Start();
    }

    public createRequestDb(String DbRequest){
        RequestList.Add(DbRequest);
    }

    private void SpoolerRunner()
    {
        while (true)
        {
            if (RequestList.Count() >= 1){
                Foreach (String request in RequestList){
                    // Here, you want to verify your request, if args already exist
                    // And add request in Database 
                }
             }
            // Verify is request exist in the collection every 30 seconds..
            Thread.Sleep(30000);
        }
    }

}

スプーラを使用する理由

スレッドを呼び出す前にスプーラーを初期化するときに、スレッドごとにスプーラーを呼び出し、要求ごとにコレクションに要求を追加し、スプーラーが次々に処理するという理由だけで...すべての異なるスレッドで同時に...

編集: このスプーラーはサンプルです。データベースに文字列リクエストを 1 つずつ挿入するため、必要なオブジェクトのコレクションを含むスプーラーを作成し、存在しない場合は db に挿入できます...これは単なるサンプルですスレッド数が多い場合は、順番に処理するのが解決策^^

于 2012-08-03T08:34:50.670 に答える