簡體   English   中英

多核硬件哪個更好? 多線程或異步方法

[英]Which is better for multi-core hardware? multithreading or asynchronous methods

我們需要為大型屏幕開發儀表板應用程序。 它的作用是收集所有KPI(關鍵績效指標)並將其以可視方式實時顯示在大屏幕上,以便管理領導知道發生了什么。

因此,巨大的屏幕將具有20到30個獨立的圖形和餅圖(數量可能會很快增加),需要在可配置的時間內刷新數據。 從技術上講,它意味着需要進行大量數據庫調用才能提取數據並將數據更改通知給GUI。 由於有許多要更新的單個圖,因此我不想同步更新它們,因為一個圖的耗時數據庫查詢會延遲另一個圖的更新。

所以我有兩個選擇

  1. 在每個圖形的單獨線程/任務中運行數據庫調用,計算並通知GUI數據的變化。
  2. 將所有數據庫調用編寫為異步方法,實現計算並在回調中通知GUI

盡管這兩種方法都可以滿足目的,但我想知道哪種解決方案更好,尤其是考慮到硬件具有16個內核的事實。 這兩種方法的優缺點是什么? 還是有解決這個問題的更好方法?

我們計划將.NET 4.0和WPF用於UI和C#作為開發語言。

我認為有關這兩種技術的要點如下:

  • 多線程方法限制了您可以並行執行的操作數量,因為線程是相對昂貴的資源。 但是,如果您需要約20個線程,則不會有任何麻煩。 用C#編寫此代碼可能會更容易,因為您可以使用通常的順序編程樣式。

  • 異步調用使您可以“並行”執行更大數量的I / O綁定操作,因為每個調用都不會占用整個線程,因此這效率更高,並且還受益於系統上的多個內核(因為異步操作是使用線程池處理)。 在C#中,這可能更難使用,因為您需要使用諸如BeginXyz之類的APM方法(這使一些常見的編程模式難以編碼)。

您可以使用一些高級庫來用C#編寫異步代碼-例如, AsynchronousEnumerator為您提供了一種相對舒適的編程風格。 您也可以考慮使用具有異步工作流程消息傳遞並發性的 F#,這很可能是您問題的完美匹配。

如果可能,我建議使用PLINQ和任務並行庫 它們包括最佳分區,線程擴展和竊取所有內置內容的工作。

這些方法中的每一個都將使用多線程來實現您的目標。

異步方法只會使繁重的工作變得容易一些(它們是異步的,因為它們在另一個線程上啟動,並在完成時通知原始線程)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM