2017-01-31 21 views
1

有条件和并行运行多个方法我有一些代码,目前看起来有点像这样:我如何能在C#

private void GetBatchJobList() //gets the list of JOBS 
{ 
    var queuedJobList = manager.GetAllBatchJobs(); 
    foreach (var job in queuedJobList) 
    { 
     ExecuteJob(job.JobName, job.InputList); //for each JOB this method is called 
    } 
} 

private void ExecuteJob(string jobName, string parameter) 
{ 
    switch (jobName) 
    { 
     case "JobName1": 
      OrderJob.JobName1(Convert.ToInt32(parameter)); 
       break; 

      case "JobName2": 
       OrderJob.JobName2(Convert.ToDateTime(parameter)); 
       break; 
     } 
    } 

,因为你可以看到这些方法后,其他执行一个。我想要并行运行这些方法。 这些功能的实际名称是不同的。 ExecuteJob做IO相关的工作。

如何更改我的代码,以便并行执行函数调用并取决于条件ex。(JobName == JobName1)。

希望这可以解释它。我只是一个初学者。 在此先感谢。

+2

ExecuteJob是做基于CPU还是基于IO的工作? –

+0

我试图寻找到Parallel.Foreach。因为我只是一个初学者,所以很难理解。 – Shefali

+0

@Yuval ExecuteJob执行基于IO的工作 – Shefali

回答

3

您可以使用取决于系统环境Parallel.ForEach

Parallel.ForEach(manager.GetAllBatchJobs(), job => ExecuteJob(job.JobName, job.InputList)) 

并行运行。通常你拥有的CPU越多,运行速度就越快。但千万不要以为平行就是总是更快。例如。如果作业执行速度快且作业少,则顺序执行可能会更快。

延伸阅读:Potential Pitfalls in Data and Task Parallelism

+2

如果他的工作受到IO的约束,使用'Parallel.ForEach'不可能让他走得太远。 –

+0

@SergeyBerezovskiy在调试时,控制不会进入ExecuteJob方法。我也有一个线程的计时器。有些是这样的:内嵌'void timer_Elapsed(object sender,ElapsedEventArgs e) {012;}} {if worker.IsBusy} worker.RunWorkerAsync(); }' 内嵌'无效worker_DoWork(对象发件人,DoWorkEventArgs E) {// 任何你想要的后台线程做... JobsQueue J =新JobsQueue(); j.GetBatchJobList(); }'等待2分钟后,它会触发timer_Elapsed方法。 – Shefali

+0

@Shefali对不起,目前还不清楚你在做什么与计时器。另外,如果(在您编辑之后)显然您正在执行IO绑定作业,则考虑为每个作业运行任务并使用“等候Task.WhenAll”等待它们 –