Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有连续(无止境)任务的线程管理控制台程序_C#_Database_Multithreading - Fatal编程技术网

C# 具有连续(无止境)任务的线程管理控制台程序

C# 具有连续(无止境)任务的线程管理控制台程序,c#,database,multithreading,C#,Database,Multithreading,我是穿线新手,请耐心点 我在一个数据库中有上万行。每一行代表一项需要通过互联网完成的工作。我读取一个数据行,做一些与网络相关的工作(甚至可能需要几秒钟到几分钟),然后抓取下一个数据行(我的C#应用程序使用控制台,而不是GUI)。正如你所料,我想同时做这些工作 我研究了这个主题,我想我会使用BackgroundThreads,但是如果我理解正确的话,在控制台应用程序中使用它们是没有意义的 我假设我不应该使用任务,因为我的每个“任务”都将由一个线程表示 所以我想我应该使用带有常规线程的线程池 为了使

我是穿线新手,请耐心点

我在一个数据库中有上万行。每一行代表一项需要通过互联网完成的工作。我读取一个数据行,做一些与网络相关的工作(甚至可能需要几秒钟到几分钟),然后抓取下一个数据行(我的C#应用程序使用控制台,而不是GUI)。正如你所料,我想同时做这些工作

我研究了这个主题,我想我会使用BackgroundThreads,但是如果我理解正确的话,在控制台应用程序中使用它们是没有意义的

我假设我不应该使用任务,因为我的每个“任务”都将由一个线程表示

所以我想我应该使用带有常规线程的线程池

为了使事情变得简单,我只想保持恒定数量的线程(当一个线程完成时生成新的线程),直到我没有事情要做(然后我等待数据——通常是大量数据——到达数据库并生成线程)。我需要知道线程何时结束,因为我必须生成一个新线程,并更新包含它所处理的数据的数据库行。为了使线程和数据库保持同步,我可能必须在检索数据库行时用某种线程id标记该行,然后在线程结束时标记该行(成功/失败)。 (尝试线程委托中的catch)是否足以确保线程已结束(以及是否成功或引发异常)

我不知道如何“等待”第一个线程结束——不是所有线程,也不是特定线程

我还认为我不想提前读取太多数据(并可能等待线程释放),因为可能有其他程序使用相同的数据库执行相同的操作


任何想法都值得赞赏

只需使用
Parallel.ForEach
即可:

Parallel.ForEach(rows, row => ProcessRow(row));
如果由于自动分区器恰好使用了太多的线程池线程而需要指定最大并行度,则可以这样指定:

Parallel.ForEach(rows, new ParallelOptions() { MaxDegreeOfParallelism = 5 }
    , row => ProcessRow(row));

只需使用
Parallel.ForEach
即可:

Parallel.ForEach(rows, row => ProcessRow(row));
如果由于自动分区器恰好使用了太多的线程池线程而需要指定最大并行度,则可以这样指定:

Parallel.ForEach(rows, new ParallelOptions() { MaxDegreeOfParallelism = 5 }
    , row => ProcessRow(row));

因为您的瓶颈将是网络而不是CPU,所以您不应该使用任务。这可能是使用.NET 4.5的异步/等待功能的好地方,因为瓶颈是网络而不是CPU,所以不应该使用任务。这可能是一个使用.NET 4.5的异步/等待功能的好地方。我不确定如何继续向它提供数据。你建议我用某种方式缓冲数据?读一部分,执行parelle.ForEach,等待它完成,读另一部分?它需要一直以最大容量运行,我不能一次读取整个数据库。@user1713059如果您传入一个
IEnumerable
延迟加载行,您不会有任何问题。如果您没有流式处理行的方法,那么您可以根据需要对其进行批处理。我不确定如何继续向其提供数据。你建议我用某种方式缓冲数据?读一部分,执行parelle.ForEach,等待它完成,读另一部分?它需要一直以最大容量运行,我不能一次读取整个数据库。@user1713059如果您传入一个
IEnumerable
延迟加载行,您不会有任何问题。如果您没有流式处理行的方法,那么您可以根据需要对它们进行批处理。