2

コードを取得できる最も基本的なコードに落とし込んでいますが、それでも問題が発生します。

public void SomeMethod()
{
    CompanyList allCompanies = GetAllCompanies();

    foreach (Company x in allCompanies)
    {
         List<string> warnings = x.GenerateWarnings();
    }
}

public class Company
{
    public string CompanyCode { get; set; }

    public List<string> GenerateWarnings()
    {
        List<string> warnings = new List<string>();

        using (OleDbConnection conn = new OleDbConnection(connstring)) //ms access database
        {
            conn.Open();

            //do lots of stuff here, but commented out, still causes a problem
            //basically making some database calls to confirm that an expected
            //value is actually in the table.  List<string> warnings is then
            //populated based on the results of these calls.

            conn.Close();
        }
        return warnings;
    }
}

つまり、allCompanies の最初のループが CompanyCode 0001 の Company であるとしましょう。コードをステップ実行すると、予想どおり、Company の GenerateWarnings() コードに到達します。ただし、conn.Open() に到達したときの次のステップは、CompanyCode 0002 の Company が GenerateWarnings() に到達することです。次のステップは、CompanyCode 0001 で、conn.Close() に到達します。この Company のインスタンス間のジャンプは、allCompanies の foreach ループ全体で行われます。これは一貫したパターンではありません。たとえば、1 つの会社がオープンしてクローズし、コードの残りの部分に進むなど、頻繁にジャンプすることがあります。その後、次のステップはランダムに一部の会社の conn.Close() になります。 20 ステップ前のように conn.Open() を実行しました。

マルチスレッドや非同期処理などの特別なことは何も指定していないので、なぜこれが起こっているのか少し混乱しています。をお願いします...

  • A) これが起こっている理由を理解し、
  • B) 飛び回るのを止める方法を知ること

編集:これがMS Accessデータベースであるという事実に関連している可能性があるというヒントを見つけました。ページを実行すると、Access ファイルを開いたときに作成される .ldb がすばやく表示されたり消えたりします。

EDIT 2:これは私にとって本当に奇妙です。プロセス全体に簡単なワンライナーを挿入して、forloop の進行状況をタイムスタンプ付きのテキスト ファイルに記録しました。これにより、何が起こっているかを正確に確認できました。これを行うと、テキストは各行を順番に記録します。飛び回ることなく。テキスト関数呼び出しにログを追加して、意図せずにそれを調整したり、何かしたりしましたか? これは私の問題を効果的に解決しますが、始めたときよりも今はさらに混乱しています。

4

1 に答える 1

1

using/open/close コードを SomeMethod に移動し、conn obj を GenerateWarnings に渡さないのはなぜですか?

アイテムごとに開いたり閉じたりする必要がなく、はるかに高速に実行されるはずです。

SomeMethod()
{
    Using(...) 
    {
        Conn.open...
        Foreach (Company...)
        {
           ...GenerateWarnings(conn)..
        }
        Conn.close...
    }
}

GenerateWarnings(conn)
{
    ...use conn to make db calls...
}

(またはリファクタリングは、アーキテクチャが同じ結果を達成するのに理にかなっています)

于 2012-12-14T05:05:54.270 に答える