事件式實時下載更新滾動條進度數據

来源:https://www.cnblogs.com/YangJianhui/archive/2018/06/07/9149431.html
-Advertisement-
Play Games

關於下載更新數據於滾動條類似PrograssBar控制項的問題,我網上搜索了下,總體結合大致採用微軟的定時器Timer控制項更新數據。 在網上發現了典型的例子是使用TImer定時器和BackgroundWorker組件的結合更新PrograssBar進度的操作,網址如下: http://www.cnbl ...


  關於下載更新數據於滾動條類似PrograssBar控制項的問題,我網上搜索了下,總體結合大致採用微軟的定時器Timer控制項更新數據。

  在網上發現了典型的例子是使用TImer定時器和BackgroundWorker組件的結合更新PrograssBar進度的操作,網址如下:

  http://www.cnblogs.com/jaxu/archive/2011/08/05/2128811.html

  但是使用Timer定時器更新滾動條並非實時更新數據,頂多只是儘量模擬程式執行的步驟,本篇文章採用另一種下載更新滾動條數據的方式來實現實時更新數據,結合WebService網路服務和線程執行操作。

  •   關於WebService的引用大致分為組件引用和網址引用,如圖:
  •   關於WebService的部署和發佈,結合本地IIS方式,如圖:

  

  (1)主程式入口:

/// <summary>
/// 應用程式的主入口點。
/// </summary>
[STAThread]
static void Main()
{
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  //Application.Run(new Form1());
  System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(UpdateLoading));
  thread.Start();
}

static void UpdateLoading()
{
  ConvMyReord.Uil.Welcome.DownLoader downLoader = new Uil.Welcome.DownLoader();
  downLoader.Show();
  downLoader.Start();
}

  (2)DownLoader類:

private void downLoading_DownLoadingCancelEvnet()
{
  if (_downLoading != null && _downLoading.GetDialogResult == DialogResult.No)
  Application.Exit();
}

public void Start()
{
  if (_downLoading == null) _downLoading = new DownLoading();
  _downLoading.Dock = DockStyle.Fill;
  this.pnlMain.Controls.Add(_downLoading);
  _downLoading.DownLoadingCancelEvnet += downLoading_DownLoadingCancelEvnet;
  _downLoading.StartDownLoading();
}

  (3)自定義控制項:DownLoading

public delegate void DownLoadingCancel();
public event DownLoadingCancel DownLoadingCancelEvnet;
public DialogResult GetDialogResult {get;set;}

private void btnCancel_Click(object sender, EventArgs e)
{
  if(DownLoadingCancelEvnet != null)
  {
    this.GetDialogResult = DialogResult.No;
    DownLoadingCancelEvnet();
  }
}

public void StartDownLoading()
{
  ConvMyReord.WebReference.ConverRecordWebService converRecordWebService
  = new WebReference.ConverRecordWebService();
  System.Data.DataSet ds = converRecordWebService.DownLoadingScoure();//調用服務方法
  DownLoadHelper downLoadHelper = new DownLoadHelper();
  downLoadHelper.DownLoadProgressEvent += downloader_onDownLoadProgress;
  downLoadHelper.StartLoading(ds, this.progressBarControl1, lblDownLoad);
}

//同步更新UI
private void downloader_onDownLoadProgress(long totalCount, long current)
{
  float percent = 0;
  if (this.InvokeRequired)
  {
    this.Invoke(new DownLoadHelper.DownLoadProgress(downloader_onDownLoadProgress), new object[] { totalCount, current });
  }
  else
  {
    if (this.progressBarControl1.Properties.Maximum == this.progressBarControl1.Position)
    {
      this.GetDialogResult = DialogResult.Yes;
      this.btnCancel.Enabled = false;
    }
    this.progressBarControl1.Properties.Maximum = (int)totalCount;
    this.progressBarControl1.Position = (int)current;
    percent = (float)current / (float)totalCount * 100;
    this.lblDownLoad.Text = "當前補丁下載進度:" + percent.ToString() + "%";
    System.Windows.Forms.Application.DoEvents();
  }
}

  (4)DownLoadHelper幫助類:

public delegate void DownLoadProgress(long total, long current);
public event DownLoadProgress DownLoadProgressEvent;

public void StartLoading(System.Data.DataSet ds, DevExpress.XtraEditors.ProgressBarControl progressBar1, System.Windows.Forms.Label label1)
{
  if (ds == null) return;
  long totalCount = GetRowCounts(ds);
  LoadingData(totalCount, ds, progressBar1, label1);
}

private static long GetRowCounts(System.Data.DataSet ds)
{
  long count = 0;
  if (ds.Tables.Count <= 0) return count;
  for (int i = 0; i < ds.Tables.Count; i++)
  {
    System.Data.DataTable table = ds.Tables[i];
    count += table.Rows.Count;
  }
  return count;
}

public void LoadingData(long totalCount, System.Data.DataSet ds, DevExpress.XtraEditors.ProgressBarControl progressBar1, System.Windows.Forms.Label label1)
{
  if (totalCount <= 0 || ds.Tables.Count <= 0) return;
  long count = 0;
  for (int i = 0; i < ds.Tables.Count; i++)
  {
    System.Data.DataTable table = ds.Tables[i];
    if (table == null || table.Rows.Count <= 0) continue;
    for (int j = 0; j < table.Rows.Count; j++)
    {
      ++count;
      System.Windows.Forms.Application.DoEvents();
      if (DownLoadProgressEvent != null)
      DownLoadProgressEvent(100, (100/totalCount) * count);
       System.Threading.Thread.Sleep(100);
    }
  }
}

效果圖:

 

  以上是我前段時間自己編的部分程式,考慮從記憶體空間和效率上都存在不足,本篇主要是讓大家瞭解事件式實時更新滾動條數據的編程思路,不足之處,請留言賜教。
  A young idler  ~  an old beggar !


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 值類型 和引用類型的介紹 直接上代碼看: public class Study { public static int initNo = 100; public static void Test1(int i) { i = 1; } public static void Test1(ref int ...
  • 1.首先建立好XML 。可以通選自定義EXCEL導出XML格式的數據:(如圖) 2 讀取XML 文件 具體的詳細講解 可以查看 改網址 :https://blog.csdn.net/dyllove98/article/details/8708323#C5 ...
  • 1 <DataGrid Height="Auto" Width="Auto"> 2 <DataGrid.Columns> 3 <DataGridTextColumn Binding="{Binding ItemName}" Header="Name" Width="2*" /> 4 <DataGri ...
  • Swagger也算是行之有年的API文件生成器,只要在API上使用C#的<summary />文件註解標簽,就可以產生精美的線上文件,並且對RESTful API有良好的支持。不僅支持生成文件,還支持模擬調用的交互功能,連Postman都不用打開就能測API。本篇將介紹如何通過Swagger產生AS ...
  • 模型原型:伺服器的配置和運行狀態信息。 設計要求:Json格式數據解析後,判斷配置信息是否是新數據或者是否更新。如是新數據,則直接添加到資料庫;若是數據更新,則更新資料庫配置信息並更新運行狀態信息;都不是則僅將運行狀態添加到資料庫。最後從資料庫取數據並展示。 模型難點:每個伺服器會搭載多個網卡和最多 ...
  • innerHTML與innerText區別 setInterval和setTimeout的使用區別 setInterval在執行完一次代碼之後,經過了那個固定的時間間隔,它還會自動重覆執行代碼,而setTimeout只執行一次那段代碼。 MVC有幾種向頁面綁定數據的方法 1、指定頁面數據的強類型Mo ...
  • 一、什麼是API網關 API網關是一個伺服器,是系統對外的唯一入口。API網關封裝了系統內部架構,為每個客戶端提供一個定製的API。API網關方式的核心要點是,所有的客戶端和消費端都通過統一的網關接入微服務,在網關層處理所有的非業務功能。通常,網關也是提供REST/HTTP的訪問API。服務端通過A ...
  • 本文主要介紹一些常見情況的實現,包括:集合更新、翻頁、排序、過濾等等。但是仍然是Richardson成熟度為2級的Web API,未達到RESTful API的標準。 本代碼已經更新至ASP.NET Core 2.1. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...