關(guān)于網(wǎng)站建設(shè)相關(guān)文章武漢 網(wǎng)絡(luò) 推廣
描述:C# winform軟件使用了chartcontrol控件,在使用Timer 動(dòng)態(tài)為圖表添加點(diǎn)時(shí),報(bào)錯(cuò)(有時(shí)報(bào)錯(cuò),有時(shí)不報(bào)錯(cuò))
報(bào)錯(cuò)內(nèi)容如下:
System.ArgumentOutOfRangeException:“指定的參數(shù)已超出有效值的范圍。
Arg_ParamName_Name”
System.ArgumentOutOfRangeException
? HResult=0x80131502
? Message=指定的參數(shù)已超出有效值的范圍。
Arg_ParamName_Name
? Source=DevExpress.Charts.v18.1.Core
? StackTrace:
? ?在 DevExpress.Charts.Native.RefinedPointCollection.InsertRange(Int32 index, ICollection`1 collection)
? ?在 DevExpress.Charts.Native.CollectionManager.InsertSeriesPoints(IPointProcessor processor, Int32 insertIndex, ICollection`1 insertPoints)
? ?在 DevExpress.Charts.Native.CollectionManager.UpdateCollections(IPointProcessor processor, SeriesPointsCollectionAction updateAction)
? ?在 DevExpress.Charts.Native.PointsProcessor.UpdatePoints(SeriesPointsCollectionAction updateAction)
? ?在 DevExpress.Charts.Native.SeriesController.ContextCalculator.ActionsExecutor.UpdateSeriesPointsCollection(SeriesPointsCollectionActionBase update)
? ?在 DevExpress.Charts.Native.SeriesController.ContextCalculator.ActionsExecutor.Execute()
? ?在 DevExpress.Charts.Native.SeriesController.ContextCalculator.CalculateContext(ChartUpdateAggregator updateAggregator)
? ?在 DevExpress.Charts.Native.SeriesController.UpdatesExecutor.Execute(ChartUpdateAggregator updateAggregator)
? ?在 DevExpress.Charts.Native.SeriesController.CommitTransaction(Boolean loading)
? ?在 DevExpress.XtraCharts.Native.ViewController.ApplyChangesCore()
? ?在 DevExpress.XtraCharts.Native.ViewController.ApplyChanges()
? ?在 DevExpress.XtraCharts.Native.ViewController.ApplyChangesBeforeRender()
? ?在 DevExpress.XtraCharts.Native.Chart.DrawContent(Graphics graphics, INativeGraphics nativeGraphics, Rectangle bounds, Rectangle windowsBounds, Boolean lockDrawingHelper, Boolean useImageCache, GraphicsQuality graphicsQuality)
? ?在 DevExpress.XtraCharts.Native.Chart.DrawContent(Graphics graphics, Rectangle bounds, Boolean useImageCache)
? ?在 DevExpress.XtraCharts.ChartControl.OnPaint(PaintEventArgs e)
? ?在 System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
? ?在 System.Windows.Forms.Control.WmPaint(Message& m)
? ?在 System.Windows.Forms.Control.WndProc(Message& m)
? ?在 DevExpress.XtraCharts.ChartControl.WndProc(Message& m)
? ?在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
? ?在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
? ?在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
解決辦法:DevExpress 中ChartControl 在生成Chart 和動(dòng)態(tài)更新Chart 時(shí),只適用于同 一個(gè)主線程中.
將System.Timers.Timer 替換為?System.Windows.Forms.Timer 即可。
參考官方回答:ArgumentOutOfRangeException on chart repaint. | DevExpress SupportHi Support, I get an ArgumentOutOfRangeException for an invalid index when a chart repaints. The call stack?follows bellow. I know it is prahttps://supportcenter.devexpress.com/ticket/details/t733964/argumentoutofrangeexception-on-chart-repaint
ArgumentOutOfRangeException on chart repaint. | DevExpress Support
官方技術(shù)支持建議 綁定數(shù)據(jù)和圖形控件在同一線程。
解決:在訂閱事件方法中調(diào)用this.BeginInvoke()方法,在委托內(nèi)進(jìn)行數(shù)據(jù)和圖形處理。
引申:
1、System.Windows.Forms:
System.Windows.Forms命名空間下的Timer控件,它直接繼承自Componet。Timer控件只有綁定了Tick事件和設(shè)置Enabled=True后才會(huì)自動(dòng)計(jì)時(shí),停止計(jì)時(shí)可以用Stop()方法控制,通過Stop()停止之后,如果想重新計(jì)時(shí),可以用Start()方法來啟動(dòng)計(jì)時(shí)器。Timer控件和它所在的Form屬于同一個(gè)線程;
2、System.Timers.Timer:
System.Timers命名空間下的Timer類。System.Timers.Timer類:定義一個(gè)System.Timers.Timer對象,然后綁定Elapsed事件,通過Start()方法來啟動(dòng)計(jì)時(shí),通過Stop()方法或者Enable=false停止計(jì)時(shí)。AutoReset屬性設(shè)置是否重復(fù)計(jì)時(shí)(設(shè)置為false只執(zhí)行一次,設(shè)置為true可以多次執(zhí)行)。Elapsed事件綁定相當(dāng)于另開了一個(gè)線程,也就是說在Elapsed綁定的事件里不能訪問其它線程里的控件(需要定義委托,通過Invoke調(diào)用委托訪問其它線程里面的控件)。
?