2013-02-14 79 views
0

我想優化一個我創建的備份程序。該代碼是馬虎,因爲這是我的第一個程度如此巨大,但希望你可以看看過去。使用Parallel.ForEach

這個程序運行良好,但它似乎需要更長的時間。所以我正在用Parallel.ForEach來幫助優化壓縮過程。

現在,我有計劃做荏苒任務通過以下方式

Dim Destin = JobNode.SelectNodes("Destination") 

For Each item As System.Xml.XmlNode In Destin 
    Dim time As DateTime = DateTime.Now 
    Dim format As String = "MMMddyyyy" 
    Dim zpath As String = item.InnerText 
    'replaces [date] in destination with actual Date 
    If time.DayOfWeek = 1 Then 
     time = time.AddDays(-1) 
     item.InnerText = Replace(item.InnerText, "[date]", time.ToString(format) & "_WE") 
     zpath = item.InnerText 
     zip.ParallelDeflateThreshold = -1 
     zip.Save(zpath) 
    Else 
     Dim time1 As DateTime = DateTime.Now.AddDays(-1) 
     item.InnerText = Replace(item.InnerText, "[date]", time1.ToString(format)) 
     zpath = item.InnerText 
     zip.ParallelDeflateThreshold = -1 
     zip.Save(zpath) 
    End If 
Next 

我都保存在一個XML文件進行讀取源和目標位置。而這個每個循環的工作原理就是我想要的。但是,我無法將這個每個循環轉換成一個Parallel.ForEach循環。

任何幫助將是很好的。再說一次,在編程方面,我仍然是綠色的,所以對我來說很愚蠢。

是的...我環顧了互聯網尋求幫助,但它要麼混淆我,不在我的上下文中工作,或者我無法讓它與我的代碼一起工作。

+0

爲什麼你認爲它需要更長的時間比必要嗎?您的程序很可能受到磁盤驅動器速度的限制。如果您使用的是Windows 7(我不知道Vista或Windows 8),那麼您可以使用任務管理器的性能選項卡中提供的資源監視器(按Ctrl + Shift + Esc)查看要發生的事情上。在Overview選項卡上,查看右側的CPU和Disk圖表。 – 2013-02-14 21:09:31

+0

嗯,我想我不確定它是否完全最佳。我只是想,讓每個工作都被壓縮在一個單獨的線程上會加速一些。在同一時間壓縮每個作業必須節省時間......對吧? – MaylorTaylor 2013-02-14 21:19:15

+0

不一定:如果磁盤驅動器必須將磁頭來回移動到更多位置,則可以通過並行壓縮文件來降低速度。測試將揭示是否是這種情況。請記住,它必須移動頭從源文件讀取,然後再移動它以寫入目標文件。 – 2013-02-14 21:25:05

回答

0

試試這個:

Dim Destin = JobNode.SelectNodes("Destination").OfType(Of XmlNode) 

    Dim format As String = "MMMddyyyy" 
    Parallel.ForEach(Destin, 
     Sub(item) 
     Dim time As DateTime = DateTime.Now.AddDays(-1) 
     Dim zpath As String = item.InnerText 
     'replaces [date] in destination with actual Date 
     Dim timeString = If(time.DayOfWeek = 1, time.ToString(format) & "_WE", time.ToString(format)) 
     item.InnerText = Replace(item.InnerText, "[date]", timeString) 
     zpath = item.InnerText 
     zip.ParallelDeflateThreshold = -1 
     zip.Save(zpath) 
     End Sub) 
+0

* AmbiguousMatchException未處理*重載解析失敗,因爲沒有可以使用這些參數調用公共'ForEach': '公共共享函數forEach(的源)作爲OrderablePartitioner(的TSource),正文作爲操作(的TSource,ParallelLoopState ,Long))As System.Threading.Tasks.ParallelLoopResult': 參數匹配參數'source'的參數類型推斷失敗。 參數匹配參數'body'的參數類型推斷失敗。 – MaylorTaylor 2013-02-14 21:13:23

+1

什麼是JobNode的類型? SelectNodes會返回IEnumerable(Of T)還是IEnumerable?當您聲明Destin時,您可能需要使用.OfType(Of x)強制鍵入。 – 2013-02-14 21:26:45

+0

對於JobNode ....中的每個JobNode,我稱之爲JobNode。 JobNode由Dim JobNodes調用爲XmlNodeList = doc.getelementbytagname(「Job」) – MaylorTaylor 2013-02-14 21:35:01