亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

實(shí)用指南:C#中優(yōu)雅更新GUI的基礎(chǔ)和高級(jí)技巧(WinForms和WPF)

admin
2024年1月24日 23:32 本文熱度 2073

概述:以上內(nèi)容詳細(xì)介紹了在C#中如何從另一個(gè)線程更新GUI,包括基礎(chǔ)功能和高級(jí)功能。對(duì)于WinForms,使用`Control.Invoke`;對(duì)于WPF,使用`Dispatcher.Invoke`。高級(jí)功能使用`SynchronizationContext`實(shí)現(xiàn)線程間通信,確保清晰、可讀性高的代碼。

在C#中,從另一個(gè)線程更新GUI通常需要使用UI線程的同步上下文(SynchronizationContext)或者專門(mén)用于在UI線程執(zhí)行操作的方法(Control.InvokeDispatcher.Invoke)。下面分別給出在WinForms和WPF中的基礎(chǔ)功能和高級(jí)功能的實(shí)例源代碼。

在WinForms中更新GUI:

基礎(chǔ)功能:

  1. 創(chuàng)建WinForms應(yīng)用程序: 創(chuàng)建一個(gè)包含按鈕和標(biāo)簽的WinForms應(yīng)用程序。

  2. 創(chuàng)建后臺(tái)線程: 使用Thread類或Task.Run創(chuàng)建一個(gè)后臺(tái)線程,模擬耗時(shí)操作。

  3. 使用Invoke更新UI: 在后臺(tái)線程中使用Control.Invoke更新UI。

示例源代碼:

using System;
using System.Threading;
using System.Windows.Forms;

namespace WinFormsThreadedGUIUpdate
{
   public partial class MainForm : Form
   {
       public MainForm()
       {
           InitializeComponent();
       }

       private void btnStartTask_Click(object sender, EventArgs e)
       {
           // 啟動(dòng)后臺(tái)任務(wù)
           Thread thread = new Thread(PerformTask);
           thread.Start();
       }

       private void PerformTask()
       {
           // 模擬耗時(shí)操作
           Thread.Sleep(3000);

           // 在UI線程上更新標(biāo)簽文本
           UpdateLabel("Task 完成!");
       }

       private void UpdateLabel(string text)
       {
           if (lblStatus.InvokeRequired)
           {
               // 在UI線程上異步執(zhí)行更新操作
               lblStatus.Invoke(new Action(() => lblStatus.Text = text));
           }
           else
           {
               // 在UI線程上直接更新操作
               lblStatus.Text = text;
           }
       }
   }
}

在WPF中更新GUI:

基礎(chǔ)功能:

  1. 創(chuàng)建WPF應(yīng)用程序: 創(chuàng)建一個(gè)包含按鈕和標(biāo)簽的WPF應(yīng)用程序。

  2. 創(chuàng)建后臺(tái)線程: 使用Task.Run創(chuàng)建一個(gè)后臺(tái)線程,模擬耗時(shí)操作。

  3. 使用Dispatcher更新UI: 在后臺(tái)線程中使用Dispatcher.Invoke更新UI。

示例源代碼:

using System;
using System.Threading;
using System.Windows;

namespace WPFThreadedGUIUpdate
{
   public partial class MainWindow : Window
   {
       public MainWindow()
       {
           InitializeComponent();
       }

       private void btnStartTask_Click(object sender, RoutedEventArgs e)
       {
           // 啟動(dòng)后臺(tái)任務(wù)
           Task.Run(() =>
           {
               // 模擬耗時(shí)操作
               Thread.Sleep(3000);

               // 在UI線程上更新標(biāo)簽文本
               UpdateLabel("Task 完成!");
           });
       }

       private void UpdateLabel(string text)
       {
           if (Dispatcher.CheckAccess())
           {
               // 在UI線程上直接更新操作
               lblStatus.Content = text;
           }
           else
           {
               // 在UI線程上異步執(zhí)行更新操作
               Dispatcher.Invoke(new Action(() => lblStatus.Content = text));
           }
       }
   }
}

高級(jí)功能:

在高級(jí)功能中,WinForms和WPF均可以使用SynchronizationContext進(jìn)行線程間通信,代碼更為簡(jiǎn)潔。

示例源代碼:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AdvancedThreadedGUIUpdate
{
   public partial class MainForm : Form
   {
       private readonly SynchronizationContext synchronizationContext;

       public MainForm()
       {
           InitializeComponent();

           // 獲取當(dāng)前同步上下文
           synchronizationContext = SynchronizationContext.Current;
       }

       private void btnStartTask_Click(object sender, EventArgs e)
       {
           // 啟動(dòng)后臺(tái)任務(wù)
           Task.Run(() =>
           {
               // 模擬耗時(shí)操作
               Thread.Sleep(3000);

               // 在UI線程上更新標(biāo)簽文本
               synchronizationContext.Post(new SendOrPostCallback(UpdateLabel), "Task 完成!");
           });
       }

       private void UpdateLabel(object state)
       {
           // 在UI線程上更新標(biāo)簽文本
           lblStatus.Text = state.ToString();
       }
   }
}

在WPF中,Dispatcher本身就是一種同步上下文,所以代碼更為簡(jiǎn)潔,無(wú)需額外的同步上下文對(duì)象。高級(jí)功能的WPF示例代碼與基礎(chǔ)功能示例代碼相似。


該文章在 2024/1/24 23:32:01 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved