【发布时间】:2016-10-30 08:45:53
【问题描述】:
我的应用正在使用HTMLAgilityPack 解析HTML 和System.Data.SqlClient 以连接本地数据库并获取/插入数据。
问题是代码示例没有任何错误:
Database databaseObject = new Database();
List<Account> accounts = new List<Account>();
...
//Add some data to accounts and databaseObject
...
databaseObject.Open()
foreach (Account account in accounts)
{
accounts.doMagic(this, databaseObject);
}
我没有添加databaseObject.Close() 以确保与数据库的连接存在。好的,现在这里是不能正常工作的代码:
Database databaseObject = new Database();
List<Account> accounts = new List<Account>();
...
//Add some data to accounts and databaseObject
...
databaseObject.Open()
foreach (Account account in accounts)
{
Thread thread = new Thread(() => account.doMagic(this, databaseObject ));
thread.Start();
}
这也行不通:
Database databaseObject = new Database();
List<Account> accounts = new List<Account>();
...
//Add some data to accounts and databaseObject
...
databaseObject.Open()
Parallel.ForEach(accounts, account =>
{
account.doMagic(this, databaseObject );
});
它开始工作,但几秒钟后我收到System.InvalidOperationException 的信息,ExecuteNonQuery 需要打开且可用的连接。
什么?!连接应该一直打开!
我还得到了System.Data.SqlClient.SqlException 以及有关Timeout Expired 的信息
这到底是怎么回事?我没有关闭任何连接,那么如何关闭它?我不明白为什么它在实现一点多线程时不能正常工作..
【问题讨论】:
-
不要使用来自多个线程的相同连接。这将导致不一致的状态。为每个线程打开一个新连接。
-
这听起来不应该是刻薄的,但您似乎并不知道线程的第一件事。在不了解规则的情况下仅将代码的一部分标记为多线程是极其危险的。线程很难正确处理。
-
某处应该有
lock
标签: c# multithreading