1. 程式人生 > >C#多執行緒解決介面卡死問題的完美解決方案

C#多執行緒解決介面卡死問題的完美解決方案

 問題描述:
當我們的介面需要在程式執行中不斷更新資料時,

當一個textbox的資料需要變化時,

對於這個問題可以先參考下我的另外一個文章

為了讓程式執行中不出現介面卡死的現像,最好的方法就是多執行緒來解決
一個主執行緒來建立介面,使用一個子執行緒來執行程式並更新主介面
這樣就不會出現卡死的現像了
這肯定是沒有問題的,
但是為什麼在使用的過程中一樣會有很多地方會出現卡死呢,而且有使用者跟我說是我的Httphelper類的問題,其實不是,而且我再次宣告我的Httphelper類跟多執行緒並沒有關係。不要在誣賴我了哦。
這個問題其實也困或了我很久,但是今天終於解決了,而且我發現很多人有這樣的問題,所以我分享一個例子方便大家參考吧。
先來看看我的介面

當我單擊

開始執行後

是資料在不斷的更新

這個時候介面是不會卡死的,
只是資料在不斷的更新
下面看看我的程式碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication3
{
    
public partial class Form1 : Form { public Form1() { InitializeComponent(); } //建立一個委託,是為訪問TextBox控制元件服務的。 public delegate void UpdateTxt(string msg); //定義一個委託變數 public UpdateTxt updateTxt; //修改TextBox值的方法。 public void
UpdateTxtMethod(string msg) { richTextBox1.AppendText(msg + "\r\n"); richTextBox1.ScrollToCaret(); } //此為在非建立執行緒中的呼叫方法,其實是使用TextBox的Invoke方法。 public void ThreadMethodTxt(int n) { this.BeginInvoke(updateTxt, "執行緒開始執行,執行" + n + "次,每一秒執行一次"); for (int i = 0; i < n; i++) { this.BeginInvoke(updateTxt, i.ToString()); //一秒 執行一次 Thread.Sleep(1000); } this.BeginInvoke(updateTxt, "執行緒結束"); } //開啟執行緒 private void button1_Click(object sender, EventArgs e) { Thread objThread = new Thread(new ThreadStart(delegate { ThreadMethodTxt(Convert.ToInt32(textBox1.Text.Trim())); })); objThread.Start(); } private void Form1_Load_1(object sender, EventArgs e) { //例項化委託 updateTxt = new UpdateTxt(UpdateTxtMethod); } } }

上面是全部程式碼方便大家參考吧

第一步我們先來定義一個委託updateTxt

  //建立一個委託,是為訪問TextBox控制元件服務的。
        public delegate void UpdateTxt(string msg);
        //定義一個委託變數
        public UpdateTxt updateTxt;

主要是使用一個委託來更新介面的richTextBox1

例項方法如下

  private void Form1_Load_1(object sender, EventArgs e)
        {
            //例項化委託
            updateTxt = new UpdateTxt(UpdateTxtMethod);
        }

 UpdateTxtMethod方法如下

 //修改TextBox值的方法。
        public void UpdateTxtMethod(string msg)
        {
            richTextBox1.AppendText(msg + "\r\n");
            richTextBox1.ScrollToCaret();
        }

下面我們來定義一個迴圈來輸出一個值的,關呼叫這個委託來更新richTextBox1

 //此為在非建立執行緒中的呼叫方法,其實是使用TextBox的Invoke方法。
        public void ThreadMethodTxt(int n)
        {
            this.BeginInvoke(updateTxt, "執行緒開始執行,執行" + n + "次,每一秒執行一次");
            for (int i = 0; i < n; i++)
            {
                this.BeginInvoke(updateTxt, i.ToString());
                //一秒 執行一次
                Thread.Sleep(1000);
            }
            this.BeginInvoke(updateTxt, "執行緒結束");
        }

 然後就是使用一個子執行緒來呼叫它了

  //開啟執行緒
        private void button1_Click(object sender, EventArgs e)
        {
            Thread objThread = new Thread(new ThreadStart(delegate
            {
                ThreadMethodTxt(Convert.ToInt32(textBox1.Text.Trim()));
            }));
            objThread.Start();
        }

好了就這樣基本上就可以了。

那問題現在那裡呢,其實就出在這一句上

this.BeginInvoke(updateTxt, "執行緒結束");

 大家也許已經發現了,我是這樣寫的,而不是

updateTxt("執行緒結束");

 這樣來直接在子執行緒中使用,
我相信有很多同志都是這樣寫的,其實錯就錯在這裡
如果直接使用

updateTxt("執行緒結束");

 大家想一下應該就明白了,
updateTxt是在主執行緒建立的,而我們在子執行緒中直接使用,執行的資料多了,就會出現卡死,這是介面資訊堵死的原因,
所以就算是委託也不能直接在子執行緒中使用,而是要使用BeginInvoke方法來呼叫這個委託
這樣才不會出現卡死的現像。
問題就解決了。
大家支援一下哦

相關推薦

C#執行解決介面卡問題的完美解決方案

 問題描述: 當我們的介面需要在程式執行中不斷更新資料時, 當一個textbox的資料需要變化時, 對於這個問題可以先參考下我的另外一個文章 為了讓程式執行中不出現介面卡死的現像,最好的方法就是多執行緒來解決 一個主執行緒來建立介面,使用一個子執行緒來執行程式並更新主介面

C++:蟻群演算法解決TSP(C++執行版)

TSP問題:旅行商問題,最短迴路。 這裡採用att48資料,鄰接矩陣全部取整數,原資料放在文後。 解決程式碼如下: //#define TEST_INPUT //#define TEST_T //#define TEST_ANT //#define TEST_VALUE #

C# 執行資源克隆解決方式及其應用

背景:多執行緒中的共享資源處理常用的方法是加鎖,但是加鎖是的任務處理由並行處理程式設計了序列處理大大降低了多執行緒的效率,這裡介紹另一種處理多執行緒共享資源的處理方式克隆,介紹在C#中克隆解決多執行緒問題的示例和其他開源框架中使用這種思想實現的一些功能,歡迎大家留言交流。

C++——執行程式設計(二)std::mutex 執行同步、解決資源競爭問題

前言 執行緒同步 這裡的“同”不是同時、一起執行的意思,而是指協同、協助、互相配合。執行緒同步是指多個執行緒協同步調,按預定的先後次序進行執行。 執行緒A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B執行;B依言執行,再將結果給A;

測試程式碼,解決java gui swing執行介面假、僵死問題,實現介面動態重新整理,動態同步更新資料

(原創) 測試程式碼,解決java gui swing多執行緒介面假死、僵死問題,實現介面動態重新整理,動態更新,同步顯示資料 主類: package testguimulitiplethread; /** * * @author Administrator */ public class Mai

C# 執行學習(五)執行同步和衝突解決

首先先說一個執行緒不同步的例子吧,以下為售票員的模擬售票,多個售票員出售100張門票,程式碼如下: using System; using System.Text; using System.Collections.Generic; using Syste

c/c++ 執行 std::lock

多執行緒 std::lock 當要同時操作2個物件時,就需要同時鎖定這2個物件,而不是先鎖定一個,然後再鎖定另一個。同時鎖定多個物件的方法:std::lock(物件1.鎖,物件2.鎖...) 額外說明:lock_guard<mutex> lock_a(d1.m, std::adopt_lock

C#執行順序依賴執行控制

在開發過程中,經常需要多個任務並行的執行的場景,同時任務之間又需要先後依賴的關係。針對這樣的處理邏輯,通常會採用多執行緒的程式模型來實現。   比如A、B、C三個執行緒,A和B需要同時啟動,並行處理,且B需要依賴A完成,在進行後續的處理,C需要B完成後開始處理。  

C/C++ 執行機制

一、C/C++多執行緒操作說明 C/C++多執行緒基本操作如下: 1. 執行緒的建立結束 2. 執行緒的互斥和同步 3. 使用訊號量控制執行緒 4. 執行緒的基本屬性配置  在C/C++程式碼編寫時,使用多執行緒機制,首先需要做的事情就是宣告引用,具體如下

c/c++ 執行 std::once

多執行緒 std::once 轉自:https://blog.csdn.net/hengyunabc/article/details/33031465 std::once的特點:即使有多個執行緒要訪問同一個函式,只有一個執行緒會成功。 std::once的用途:當某個資料只有在初始化的時候需要執行緒安全

C#執行基礎(執行的優先順序、狀態、同步)

一、關於多執行緒的優先順序、狀態、同步指令碼如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System

C++執行之std::thread

C++11,包含標頭檔案 thread.h,並使用名稱空間std。 thread類提供的方法 方法 描述 thread 建構函式,在這裡傳入執行緒執行函式,和函式引數

C++ 執行pthread 學習筆記

本篇是我在學習C++多執行緒的時候做的筆記,主要記錄的是基礎的流程,部分程式碼例項,以及重點函式的說明。 pthread 入口函式型別說明 void * func1(void * t) void* 表示無型別指標 void*作為函式引數,表示函式接收一個指標,不管是什麼型別

2017.10.21 C# 執行控制控制元件例項

直接上程式碼片段 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text

2017.10.12 C#執行與非同步的區別

最近在寫個多執行緒處理的程式,又重新溫習了一下相關知識,記錄在這裡。 C#多執行緒與非同步的區別 原文地址:http://kb.cnblogs.com/page/116095/ 多執行緒和非同步操作的異同   多執行緒和非同步操作兩者都可以達到避免呼叫執行緒阻塞的目的,從而提高軟體

linux c 執行開發

在開發多執行緒程式時,當建立的執行緒數量特別多的時候,就會遇到執行緒數量的瓶頸。 多執行緒設定 設定核心引數 kernel.threads-max kernel.threads-max 是 linux 系統允許建立的最大執行緒數,預設是 7767 修改 /etc/sysc

c/c++ 執行 ubuntu18.04 boost編譯與執行的坑

多執行緒 boost編譯與執行的坑 背景:因為要使用boost裡的多執行緒庫,所以遇到了下面的坑。 系統版本:ubuntu18.04 一,安裝boost 1,去boost官網下載 boost_1_XX_0.tar.gz 2,解壓 tar -zxvf boost_1_65_0.tar.gz 3

c/c++ 執行 boost的讀寫(reader-writer)鎖

多執行緒 boost的讀寫(reader-writer)鎖 背景:保護很少更新的資料結構時,c++標準庫沒有提供相應的功能。 例如:有個DNS條目快取的map,基本上很少有更新,大部分都是讀取,但是偶爾也會有更新,這種情況下,如果在讀取的函式里加上std::mutex就過於悲觀了,每次只能有一個執行緒讀取

C# 執行學習系列二

一、關於前臺執行緒和後臺執行緒 1、簡介 CLR中執行緒分為兩種型別,一種是前臺執行緒、另一種是後臺執行緒. 前臺執行緒:應用程式的主執行緒、Thread構造的執行緒都預設為前臺執行緒 後臺執行緒:執行緒池執行緒都為後臺執行緒   2、區別 前臺執行緒:前臺執行緒一般執行重要性很高的任

執行深入學習及面試解決思路

課程目標 執行緒與程序區別 為什麼要使用多執行緒? 多執行緒應用場景? 多執行緒建立方式 獲取執行緒物件以及名稱 守護執行緒 多執行緒執行狀態 join()方法作用 多執行緒分批處理資料 作業題 面試題 備註單詞 執行緒與程序區別