我最近解决了使用BackgroundWorker时我的程序崩溃的问题。
我不完全理解为什么首先出现问题。当线程将其公寓状态设置为STA时,进程内存会增加,直到程序抛出异常"无法分配环境句柄",起初我认为这是数据库不存在的问题能够足够快地处理查询。下图中的底部图表显示了在线程设置为STA的情况下运行的程序。您可以看到使用量稳步增加,直到几乎完全下降。那是抛出异常的时候。
当线程运行时,将ApartmentState设置为MTA,顶部图表显示它的行为符合预期,使用量增加,然后启动使用和释放内存的模式。
TLDR: 为什么使用Apartment state STA的线程有问题。
下面我列出了一些相关的代码。
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script>
如果程序没有使用AddNewCustomerConvert(),程序就没有问题;方法
BackgroundWorker myWorkerBee;
List<Customers> AllCustomers
private void btnStartConversion_Click(object sender, RoutedEventArgs e)
{
myWorkerBee = new Thread(myWorkerBee_DoWork);
myWorkerBee.SetApartmentState(ApartmentState.STA);
myWorkerBee.Start();
{
private void myWorkerBee_DoWork()
{
GetOldData(); //Creates Customer object and fills AllCustomers list
AddCustomers();
}
此方法专门调用RawQuery();仅调用RawQuery()的方法或方法;方法
private void AddCustomers()
{
for (int i = 0; i < AllCustomers.Count; i++)
{
AllCustomers[i].AddNewCustomerConvert();
}
}
将查询发送到数据库
//REFERENCED PROGRAM
AddNewCustomerConvert()
{
//40 or so insert statements.
databaseConnection.RawQuery("//INSERT STATEMENT");
}