2017-01-31 37 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」等待它們 –