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 到达 GenerateWarnings() 的公司。然后我的下一步是再次使用 CompanyCode 0001,到达 conn.Close()。这种公司实例之间的跳跃在 allCompanies 的整个 foreach 循环中进行。这不是一个一致的模式,有时它会跳来跳去,就像一家公司会打开,然后关闭,然后继续执行其余代码,然后随机我的下一步将是 conn.Close() 某些公司像 20 步前一样运行 conn.Open() 。

我没有指定任何花哨的东西,比如多线程和异步的东西或类似的东西,所以我对为什么会发生这种情况有点困惑。我想...

  • A) 了解发生这种情况的原因和
  • B)知道如何阻止它跳来跳去

编辑:我发现这可能与它是一个 MS Access 数据库有关。当我运行该页面时,快速打开 Access 文件时创建的 .ldb 不断出现和消失。

编辑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 回答