设置为STA的公寓状态的线程在向postgres数据库发送许多查询时出现问题

时间:2016-06-28 19:33:22

标签: c# multithreading odbc postgresql-9.3

我最近解决了使用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");
}

Top: STA Apartment State Bottom: MTA Apartment State

0 个答案:

没有答案