小编Jos*_*ith的帖子

如何正确地限制多线程应用程序?

我有一个运行在64位Windows 2008 r2服务器上的ac #console应用程序,该服务器也承载MSSQL Server 2005.

此应用程序通过文本文件运行,读取行,将行值拆分为变量,并将数据插入到localhost托管的SQL数据库中.

每个Text文件都是一个新线程,每一行都是一个新线程,每个SQL insert语句都在一个新线程下执行.

我计算这些类型的线程中的每一个的数量,并在它们完成时递减.我想知道最好的方法是"打开"未来的线程......

例如..在打开一个新的SQL插入线程之前,我正在调用...

while(numberofcurrentthreads > specifiednumberofthreads)
{
// wait
}
new.Thread(insertSQL);
Run Code Online (Sandbox Code Playgroud)

其中,指定的数字线程数被估计为不会抛出System.OutofMemoryExceptions的值.很多猜测工作已经用于确定每个过程的数量.

我的问题是......是否有更"有效"或正确的方法来做到这一点?有没有办法读取系统内存,而不是物理内存,并根据指定的资源分配等待?

为了说明这个想法......

while(System.Memory < (System.Memory/2) || System.OutofMemory == true)
{
// wait
}
new.Thread(insertSQL);
Run Code Online (Sandbox Code Playgroud)

我正在使用的当前方法工作​​并在一个不错的时间完成..但它可以做得更好.通过该过程的一些文本文件比其他文本文件更大,并不一定能最好地利用系统资源......

例如,如果我说两个文本文件在两个文本文件<300KB时都能正常工作.如果一个或两个超过100,000KB,它就不能很好地工作.

似乎还有一个"黄油区",事物处理效率最高.平均约占所有CPU资源的75%.将这些值调高得过高,它将以100%的CPU运行,但由于无法跟上,因此处理速度较慢.

c# multithreading sleep throttling

2
推荐指数
1
解决办法
1096
查看次数

神秘的负计数器值

我正在为项目的每个 sql 调用创建新线程。有数百万个 sql 调用,因此我在新线程中调用一个过程来处理 sql 调用。

在此过程中,我想增加和减少一个计数器,以便我知道这些线程何时完成 SQL 查询。

令我惊讶的是,计数器的输出显示负值。如何?当我从 0 开始并在过程开始时加 1 并在过程结束时减 1 时?

这个 int 没有在程序的其他地方被调用。以下是代码。

public static int counter=0;

while(!txtstream.EndOfStream)
{
    new Thread(delegate()
    {
        processline();
    }).Start();
    Console.WriteLine(counter);
}

public static void processline()
{
    counter++;
    sql.ExecuteNonQuery();
    counter--;
}
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样:

1
21
-2
-2
5
Run Code Online (Sandbox Code Playgroud)

c# sql counter

0
推荐指数
1
解决办法
476
查看次数

标签 统计

c# ×2

counter ×1

multithreading ×1

sleep ×1

sql ×1

throttling ×1