我有一个运行在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运行,但由于无法跟上,因此处理速度较慢.
我正在为项目的每个 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)