none
在VB.Net 裡面使用平行處理來加速MS Chart 的效能 RRS feed

  • 問題

  • 請問版上各位先進:

    小弟使用MS Chart來畫長條圖, 由於資料筆數動輒數千筆, 分析後發現bottleneck出現在以下這個迴圈:

    Dim intCounter(6) As Integer
    For Each objMail As Object In SearchObject.Results
        Dim intDayOfWeek As Integer = objMail.ReceivedTime.Date.DayOfWeek
        intCounter(intDayOfWeek) += 1
        ChartAnalysis.Series(0).Points(intDayOfWeek).SetValueY(intCounter(intDayOfWeek))
    Next

    於是想到用Paralle.ForEach 來改寫這個For Each迴圈, 將整段程式碼依照到處找來的範例改寫如下:

    Dim intCounter(6) As Integer
    Parallel.ForEach(SearchObject.Results, Sub(objMail As Object)
                       DrawingToChart(objMail)
                       End Sub)

    Private Sub DrawingToChart(objMail as Object)
        Dim intDayOfWeek As Integer = objMail.ReceivedTime.Date.DayOfWeek
        intCounter(intDayOfWeek) += 1
        ChartAnalysis.Series(0).Points(intDayOfWeek).SetValueY(intCounter(intDayOfWeek))
    End Sub

    無奈連編譯都不能編譯...... 而且搜尋了半天, 大部份的範例都是C++或C#的,
    請問是否有熟悉VB.NET的高手高手高高手可以幫忙解惑咩? 感激不盡~~~

    2010年3月27日 下午 05:24

解答

  • Hi,

    在.NET 3.5是有辦法可以使用4.0才內含的TPL沒錯

    黑暗大那邊就有貼過使用的方法

    但是除了TPL外

    你還有使用到Sub lambdas

    像是這邊

    Parallel.ForEach(SearchObject.Results, Sub(objMail As Object)
                       DrawingToChart(objMail)
                       End Sub)


    這部份我就不確定是否可以使用在3.5

    但是依你的例子

    也許可以改成

    Parallel.ForEach(SearchObject.Results,AddressOf DrawingToChart())


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年3月28日 上午 08:35

所有回覆

  • Hi,

    不能編譯的話
    錯誤訊息要附上別人才好判別問題

    回到您的問題
    您用的是.NET 4.0嗎
    您用到的兩個語法都是.NET 4.0的
    要有裝.NET 4.0且專案建置的Framework也要選到4.0才行

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年3月28日 上午 12:25
  • 真是不好意思, 想破頭想到連環境都忘了說明了:

    1. 我用的是VS2008 + .Net Framework 3.5

    2. 另外安裝了TPL (Task Parallel Library), Parallel Extention for .Net 3.5

    3. 老實說那個語法我也看不懂, 只是依樣畫狐狸照著改, 並不知道那是.Net4.0的語法,
    那請問如果是在.Net3.5 + TPL 的環境下, 應該用什麼樣的語法才適當呢?

    4. 其實也沒有什麼編譯時的 "錯誤訊息", 因為還沒開始編譯就已經標示語法錯誤了, haha, 慚愧~~

     

    2010年3月28日 上午 06:56
  • 2010年3月28日 上午 07:16
  • Hi,

    在.NET 3.5是有辦法可以使用4.0才內含的TPL沒錯

    黑暗大那邊就有貼過使用的方法

    但是除了TPL外

    你還有使用到Sub lambdas

    像是這邊

    Parallel.ForEach(SearchObject.Results, Sub(objMail As Object)
                       DrawingToChart(objMail)
                       End Sub)


    這部份我就不確定是否可以使用在3.5

    但是依你的例子

    也許可以改成

    Parallel.ForEach(SearchObject.Results,AddressOf DrawingToChart())


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年3月28日 上午 08:35
  • 嗯..... 還是不行哩,

    前二天就是照著黑暗大的方法來安裝RX, 加入Threading.DLL參考, Import System.Threading.Tasks, 最後才改寫語法,
    沒想到還是不能用, 不知道為什麼 ^_^|||

    不過還是感謝各位大大的參與討論和大力幫忙 ^_^

    ps. by the way, 後來發現效能瓶頸不是在MSChart那行, 而是在讀取Outlook Mail Object那行, 總之, 還是得想個辦法加速這個迴圈.

    2010年3月28日 下午 01:42
  • Hi,

    您的還是不行一樣是錯誤的語法嗎?

    錯誤的語法指到的是哪一行出問題?

    效能瓶頸我一開始也有懷疑過

    因為通常在非UI執行緒要去控制控制項

    需要使用Invoke回到主執行緒去叫用

    而這段Code看來幾乎都是設定控制項的

    使用多執行緒可能也不會有改善


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年3月28日 下午 02:06