Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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#_Multithreading_Task_Scheduled Tasks - Fatal编程技术网

C# 后台任务优化资源的使用

C# 后台任务优化资源的使用,c#,multithreading,task,scheduled-tasks,C#,Multithreading,Task,Scheduled Tasks,我的问题是关于执行任务和优化资源。我有一组任务,我通过轮询数据库来获取这些任务。这些任务中的大多数执行以下操作: 连接到另一台服务器(SQL、MDX、Webservice等)并查询数据。(非I/O密集型) 接收数据并保存到服务器文件夹中的文件(I/O工作) 目前,我正在创建一个任务元数据队列。拾取任务元数据,创建一个任务(使其在单独的线程中运行)并执行。现在,我将并发任务的数量限制为可用的处理器内核的数量 显然,我正在考虑最大化服务器资源,以便尽快处理大多数任务。我想知道的是是否有改进的机会 以

我的问题是关于执行任务和优化资源。我有一组任务,我通过轮询数据库来获取这些任务。这些任务中的大多数执行以下操作:

  • 连接到另一台服务器(SQL、MDX、Webservice等)并查询数据。(非I/O密集型)
  • 接收数据并保存到服务器文件夹中的文件(I/O工作)
  • 目前,我正在创建一个任务元数据队列。拾取任务元数据,创建一个任务(使其在单独的线程中运行)并执行。现在,我将并发任务的数量限制为可用的处理器内核的数量

    显然,我正在考虑最大化服务器资源,以便尽快处理大多数任务。我想知道的是是否有改进的机会

    以下是我的看法。如果您看一下我的第一个操作步骤,它不是一个I/O密集型工作,只是对一个单独服务器的调用,但是这些调用可能会长期运行。第二步是I/O工作(但不太密集),因为它只保存数据

    例如,假设我有2个处理器内核和4个待完成的任务(Task1、Task2、Task3、Task4)。Task1和Task2将被拾取,一个线程(假设Thread1、Thread2)分别处理Taks1和Task2。在我的例子中,线程Thread1和Thread2被阻塞,直到它完成(使用数据检索和保存文件)。一旦他们完成任务,他们会选择任务3和任务4

    如果我可以在一个单独的线程上以异步方式进行操作调用的第一步,这样这些线程就不会等待整个步骤完成,那么我在想什么(现在只是一个理论)。例如,Thread1、Thread2可以启动一个单独的线程(比如Thread1A、Thread2A),分别调用服务器获取数据,并在complete返回Thread1和Thread2时执行。然后线程Thread1和Thread2(空闲时)接收数据并将其写入文件。它的作用是,在同一时间,Thread1和Thread2也可以处理Task3和Task4

    这是一个可行的办法吗。还是有更好的方法来解决这个问题。我还想知道我可以为这些类型的操作创建的最大线程数是多少:

  • 调用数据库服务器/服务
  • I/O操作(创建文件、写入文件等)
  • 请建议。任何指针/示例代码或链接都会有所帮助

    问候,,
    Girija Shankar

    听起来像是一份工作。向上的向上的走开!IOCP扩展了标准的重叠I/O。IOCP可以使用少量的线程池线程来服务大量请求。这听起来很合理,如果它只是连接到服务器,我不明白为什么你不把代码放在与写入数据的线程相同的线程中。我认为连接线程的数量比处理器内核的数量还要多也是安全的,因为它们不会做任何密集型的事情。@Logan:谢谢你的回答。我没有听到你说“我不明白你为什么不把代码放在和写数据的线程相同的线程中。”。如果我正确理解了您所指的内容,那么我为什么不将调用代码放在线程1和线程2中。我现在有同样的东西。这是每个线程所做的:1。连接到服务器启动查询并等待。2.收到查询执行数据后,将其写入文件。但问题是它是同步的。我可以异步做这个吗?如果是这样的话,我可以像这样打开的最大线程数是多少?听起来像是一份工作。向上的向上的走开!IOCP扩展了标准的重叠I/O。IOCP可以使用少量的线程池线程来服务大量请求。这听起来很合理,如果它只是连接到服务器,我不明白为什么你不把代码放在与写入数据的线程相同的线程中。我认为连接线程的数量比处理器内核的数量还要多也是安全的,因为它们不会做任何密集型的事情。@Logan:谢谢你的回答。我没有听到你说“我不明白你为什么不把代码放在和写数据的线程相同的线程中。”。如果我正确理解了您所指的内容,那么我为什么不将调用代码放在线程1和线程2中。我现在有同样的东西。这是每个线程所做的:1。连接到服务器启动查询并等待。2.收到查询执行数据后,将其写入文件。但问题是它是同步的。我可以异步做这个吗?如果是这样,我可以像这样打开的最大线程数是多少?