原創(chuàng)|行業(yè)資訊|編輯:董玉霞|2022-09-08 16:47:38.650|閱讀 201 次
概述:本文將為大家介紹具有 LightningChart.NET數(shù)據(jù)可視化控件的多線程應(yīng)用程序。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
本文將為大家介紹具有 LightningChart.NET數(shù)據(jù)可視化控件的多線程應(yīng)用程序。
使用后臺(tái)線程讓應(yīng)用程序平穩(wěn)運(yùn)行確實(shí)會(huì)產(chǎn)生很大的不同。
將非必要進(jìn)程卸載到一個(gè)或多個(gè)后臺(tái)線程有助于保持應(yīng)用程序的 UI 響應(yīng)迅速。
但是,與單線程程序相比,多線程程序需要更多的精力來開發(fā)。線程的粗心使用是導(dǎo)致細(xì)微錯(cuò)誤的一個(gè)重要原因,這可能需要花費(fèi)大量時(shí)間來定位。
本文旨在幫助理解多線程圖表應(yīng)用程序并解釋 .NET 多線程的一些概念,特別是應(yīng)如何在多線程程序中使用圖表控件LightningChart .NET 。
這是一個(gè)例子:
大多數(shù)操作系統(tǒng)對(duì)涉及用戶界面的代碼使用單線程模型。該模型對(duì)于正確排序用戶界面事件(包括擊鍵和觸摸輸入)是必要的。
該線程通常稱為主線程、用戶界面線程或UI 線程。嚴(yán)格來說,.NET對(duì)前景和背景的分類是不同的。
但在本文中,我們將非 UI 線程稱為后臺(tái)線程。
了解多線程圖表應(yīng)用程序可以提高應(yīng)用程序的性能,但對(duì) UI 控件的訪問本身并不是線程安全的。
多線程可以將您的代碼暴露給嚴(yán)重和復(fù)雜的錯(cuò)誤。操作控件的兩個(gè)或多個(gè)線程可能會(huì)強(qiáng)制控件進(jìn)入不一致的狀態(tài)并導(dǎo)致競(jìng)爭(zhēng)條件、訪問沖突、死鎖以及凍結(jié)或掛起。
如果您在應(yīng)用程序中實(shí)現(xiàn)多線程,請(qǐng)確保您以線程安全的方式調(diào)用跨線程控件。
UI 庫(Windows 窗體、WPF 和 UWP)的設(shè)計(jì)方式是只能從 UI 線程訪問 UI 元素。Windows 這樣做是為了確保 UI 控件的完整性。
LightningChart® .NET 控件是一個(gè) UI 元素。因此,適用相同的線程安全規(guī)則。與其他所有 UI 控件一樣,它要求所有 LightningChart 屬性都應(yīng)在UI 線程中更新。
在應(yīng)用程序中使用后臺(tái)線程時(shí),來自線程的所有 UI 更新都必須通過Invoke(WinForms 中的Control.Invoke()和 WPF 中的Dispatcher.Invoke())。這兩種方法都安排一個(gè)委托執(zhí)行。
WPF 調(diào)度程序更加靈活,因?yàn)樗试S用戶在向調(diào)度程序隊(duì)列添加元素時(shí)指定隊(duì)列優(yōu)先級(jí)。
這種多線程應(yīng)用程序設(shè)計(jì)在我們的演示中的以下ExampleThreadMultiChannel中進(jìn)行了演示。
我們經(jīng)常使用這種設(shè)計(jì),因?yàn)樗浅_m合在多個(gè)線程上分配計(jì)算以及盡可能快地更新圖表。
這個(gè)想法是有一個(gè)后臺(tái)線程來讀取/收集/生成新數(shù)據(jù)并通過Invoke()調(diào)用推送一些“新點(diǎn)” 。
演示(交互式示例應(yīng)用程序)示例顯示了線程安全圖表更新和后臺(tái)線程用于數(shù)據(jù)生成的使用情況。
LightningChart 渲染的原理很簡(jiǎn)單。每當(dāng)用戶添加數(shù)據(jù)(或修改屬性)時(shí),都會(huì)呈現(xiàn)圖表。
該過程涉及大量處理,包括并行循環(huán)計(jì)算、對(duì)象處置、相關(guān)屬性的更新、對(duì)象的重新創(chuàng)建等。
出于這個(gè)原因,只有一個(gè)線程應(yīng)該更新和讀取圖表——串行/同步執(zhí)行。
這是客戶端對(duì)消息的內(nèi)部操作的示意圖,其中顯示了命名管道和后臺(tái)線程。
對(duì)于標(biāo)準(zhǔn)桌面應(yīng)用程序,LightningChart 線程與主 UI 線程相同。但是,該線程不一定是主 UI 線程。
Headless 模式允許圖表在后臺(tái)線程中運(yùn)行,但所有更新都應(yīng)通過創(chuàng)建圖表的同一線程。
另一個(gè)用例是,例如,當(dāng)應(yīng)用程序可能有多個(gè)窗口,并且每個(gè)窗口可能有自己的線程時(shí)。對(duì)于這種情況,LightningChart 被允許使用它被添加到的窗口的線程(這可能是與在主應(yīng)用程序窗口上運(yùn)行的線程不同的線程)。
這種設(shè)計(jì)在我們的測(cè)試臺(tái)示例中實(shí)現(xiàn),如下圖所示:
多窗口——多線程方法。
值得注意的是,Dispatcher/Control 有兩個(gè)類似的方法:Invoke() 和 BeginInvoke()。這兩種方法都安排一個(gè)委托執(zhí)行。
另一方面(在 LightningChart .NET 的情況下)通過BeginInvoke 更新圖表,用戶立即獲得響應(yīng)式 UI。
然而,另一方面,當(dāng)實(shí)際渲染發(fā)生時(shí),應(yīng)用程序的信息有限。通過更改圖表更新類型可以實(shí)現(xiàn)類似的效果,其中:
LightningChart 是一個(gè) UI 元素。因此,為了線程安全,應(yīng)在UI Thread中更新所有 LightningChart 屬性。歡迎加入LightningChart技術(shù)交流群,獲取最新產(chǎn)品咨詢:740060302
想要了解或購(gòu)買LightningChart 正版授權(quán)的朋友,歡迎咨詢。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn