1

私はスレッドが初めてで、助けが必要です。新しいレコードを挿入するのに非常に長い時間 (つまり、50 ~ 75 秒) かかるデータ入力アプリがあります。したがって、私の解決策は、ThreadPool を介して挿入ステートメントを送信し、挿入の実行中に新しいレコード ID を返す挿入中に、ユーザーがレコードのデータの入力を開始できるようにすることでした。私の問題は、その挿入から新しい ID が返される前に、ユーザーが保存を押すことができることです。

安全に保存できるときに、そのスレッドからのイベントを介してtrueに設定されるブール変数を入れてみました。それから入れました

while (safeToSave == false)  
{  
    Thread.Sleep(200)  
}  

それは悪い考えだと思います。トレッドが戻る前に保存メソッドを実行すると、スタックします。

だから私の質問は:

  1. これを行うより良い方法はありますか?
  2. ここで何が間違っていますか?

助けてくれてありがとう。
ダグ

詳細については編集してください:

非常に大きな (最大サイズに近づいている) FoxPro データベースへの挿入を実行しています。このファイルには、約 200 のフィールドとほぼ同じ数のインデックスがあります。
そして、あなたが尋ねる前に、いいえ、私がいる前にここにあったように、それの構造を変更することはできず、それを打つ大量のレガシーコードがあります。最初の問題は、新しい ID を取得するには、最初にテーブル内の max(id) を見つけてから、それをインクリメントしてチェックサムする必要があることです。これには約 45 秒かかります。次に、最初の挿入は、その新しい id と enterdate フィールドの単純な挿入です。このテーブルは DBC に入れられない/入れられないので、自動生成 ID などを除外します。

@joshua.ewer
あなたは正しいプロセスを持っています。短期的には保存ボタンを無効にするだけだと思いますが、それをキューに渡すというあなたのアイデアを検討します。確認すべき MSMQ に関する参考資料はありますか?

4

5 に答える 5

0

このような解決策は可能ですか:

ユーザーが追加を開始する前に、一意の ID を事前に計算します。すでにテーブルにあるが、実質的にプレースホルダーである一意の ID のリストを保持します。ユーザーが挿入しようとしているときに、一意の ID の 1 つを予約します。ユーザーが保存を押すと、プレースホルダーがデータに置き換えられます。

PS: これを確認するのは難しいですが、提案している (スレッドの有無にかかわらず) との同時実行の問題に注意してください: ユーザー A が追加を開始し、ユーザー B が追加を開始し、ユーザー A が ID 1234 を最大空きとして計算します。 ID、ユーザー B は ID 1234 を最大の無料 ID として計算します。ユーザー A は ID 1234 を挿入し、ユーザー B は ID 1234 を挿入します = ブーム!

于 2008-12-17T23:45:01.730 に答える