2011-06-06 19 views
1

林試圖調用傳遞不同的值來壓縮文件夾的方法傳遞的值,使用線程來處理同樣的方法的多個運行IM相同的方法..調用具有使用線程

列表框填充了待處理作業進行處理,並使用system.timer每30秒檢查一次列表框的內容並處理列表中的所有作業。

該過程涉及從列表中獲取記錄..其中包含zip文件名zip文件將在當前目錄中提取。

我的問題是..當我有超過1個線程試圖解壓文件時,我只能得到1個文件夾解壓縮,例如..第一個電話應該解壓縮folder1,第二個電話應該解壓縮folder2 ,但是當system.timer處理列表的內容..我總是得到1個解壓縮的文件夾。

每次程序啓動時,如果我只將folder1條目放在列表中,那麼folder1會解壓,如果我將folder2條目放在列表中,那麼folder2會解壓,所以我知道那裏沒有問題的條目。

繼承人我的代碼示例:

private void JobStarterTimerEvent(object source, ElapsedEventArgs e) 
{ 
     foreach (JobModel jm in ListofWaitingBackupJobs) 
     { 
      if (jm.Status.DataValue == "Waiting") 
      { 
       //check if the server has a pending job running ... 
       // add this check later 
       ThreadPool.QueueUserWorkItem(StartJob, jm); 
      } 
     } 
} 


    private void StartJob(object job) 
    { 

     string outputdirectory; 
     outputdirectory = System.IO.Directory.GetCurrentDirectory(); 
     ProcessStartInfo p2 = new ProcessStartInfo(); 
     p2.FileName = "7za.exe "; 

     p2.Arguments = "x " + backupname + " -o" + @outputdirectory + " -y"; 


     p2.WindowStyle = ProcessWindowStyle.Hidden; 
     Process x2 = Process.Start(p2); 
     x2.WaitForExit(); 

    } 
+0

在你的'StartJob'方法中,你*完全*忽略'job'參數的值。目前還不清楚你想用它來做什麼...... – 2011-06-06 12:26:41

+0

我不會使用列表框來跟蹤工作。閱讀關於盜取作業系統的工作,並使用synclock在隊列/堆棧周圍實現它。也許所有的工作都開始相同的過程。 – CodingBarfield 2011-06-06 12:35:33

回答

1

你似乎是使用相同的輸出目錄。正如Jon提到的,你可能想使用該參數來確定要解壓到的相關唯一文件夾。

0

我的錯誤..對象工作被投入到一個Jobmodel ... 我解決了這個問題..我宣佈備份名在類的頂部..所以每次我調用StartJob方法..它讀取最新的backupname變量..我應該聲明備份名稱作爲StartJob方法內的局部變量。