0

queue があり、時間外にデータを受け取ります。マルチスレッドを使用してデキューし、データベースに保存しました。この作業を行うために、スレッドの配列を作成します。

for (int i = 0; i < thr.Length; i++)
{
    thr[i] = new Thread(new ThreadStart(SaveData));
    thr[i].Start();
}

データの保存

注 : eQ および eiQ は 2 つのグローバル キューです。while を使用して、スレッドを存続させました。

public void SaveData()
{

    var imgDAO = new imageDAO ();
    string exception = "";
    try
    {
        while (eQ.Count > 0 && eiQ.Count > 0)
        {
            var newRecord = eQ.Dequeue();
            var newRecordImage = eiQ.Dequeue();                        

            imageDAO.SaveEvent(newEvent, newEventImage);

            var storepath = Properties.Settings.Default.StorePath;
            save.WriteFile(storepath, newEvent, newEventImage);
        }
    }
    catch (Exception e)
    {                
        Global._logger.Info(e.Message + e.Source);
    }
}

マルチスレッドを作成しましたが、デバッグすると、1つのスレッドだけが生きていて、残りは死んでいます。どうしてか分かりません ?誰でも考えがありますか?Tks

4

2 に答える 2

1

WriteFileそのスレッド関数で使用しています。

別のスレッド(同じファイル名など)によってロックされている可能性のあるファイルを書き込もうとしている可能性はありますか?

そしてもう1つ-複数のスレッドでディスクにデータを保存する-私はそれが好きではありません。

多くのスレッドではなくバッファを作成し、いくつかのレコード/エントリごとに書き込む必要があると思います。

于 2012-11-29T08:17:48.023 に答える
1

コメントで述べたように、スレッドはキューに要素がある限り存続し、両方が空になるとすぐにスレッドは終了します。これは、デバッグ中に生きているスレッドが 1 つしか表示されない理由を説明できます。

あなたの質問に対する潜在的な答えは、Queue の代わりにSystem.Collections.Concurrentクラスの BlockingCollection を使用することです。これには、ブロッキング デキューを実行する機能があり、より多くの要素を処理できるようになるまでスレッドを停止します。

もう 1 つの問題は、eQeiQの間の適切な競合状態です。単一の操作でnewRecordnewRecordImageの両方をデキューできるように、Tuple またはカスタム データ型で単一のキューを使用することを検討してください。

于 2012-11-29T08:22:03.663 に答える