c#中 線程訪問控制項的解決方法 可直接調用此方法

来源:http://www.cnblogs.com/lazysoft/archive/2017/11/08/7803399.html
-Advertisement-
Play Games

問題 由於在初學c#的時候 使用了 線程委托去執行函數,是為了不讓軟體窗體假死。所以使用下方代碼: Thread th = new Thread(Getform); //創建線程 th.Start(); 在使用前需要引入 : using System.Threading; 但是,在Getform 函 ...


問題

由於在初學c#的時候 使用了 線程委托去執行函數,是為了不讓軟體窗體假死。所以使用下方代碼:

Thread th = new Thread(Getform); //創建線程
th.Start();

在使用前需要引入 : using System.Threading;

 

但是,在Getform 函數中,我調用了修改窗體控制項內容的命令。

textbox.text="假";

直接報錯了。

線程間操作無效: 從不是創建控制項“textbox”的線程訪問它

好吧。查找資料,進行查看解決方法、

解決方法:

1、直接忽略線程許可權的檢查。

public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}

我們加入了這段代碼:Control.CheckForIllegalCrossThreadCalls = false; //忽略線程許可權檢查

個人理解:這樣直接忽略也可能有其他的問題,所以大家都是不推薦的,但是也確實在某些時候可以使用,畢竟 方便。。。

2、使用委托進行安全的修改,使用delegate和invoke來從其他線程中控制控制項信息(網路複製說明)

 網路上的代碼 直接複製在C#中查看更加明顯

public partial class Form1 : Form 
{ 
private delegate void FlushClient();//代理 
public Form1() 
{ 
InitializeComponent(); 
} 
private void Form1_Load(object sender, EventArgs e) 
{ 
Thread thread = new Thread(CrossThreadFlush); 

thread.IsBackground=true; 
thread.Start(); 
} 

private void CrossThreadFlush() 
{ 
//將代理綁定到方法 
FlushClient fc = new FlushClient(ThreadFuntion); 
this.BeginInvoke(fc);//調用代理 
} 
private void ThreadFuntion() 
{ 
while (true) 
{ 
this.textBox1.Text = DateTime.Now.ToString(); 
Thread.Sleep(1000); 
} 
} 
} 

看起來還是相對很簡單的,只是這種會讓視窗無響應,因為在無限的刷新視窗,但是。會不會有更好的處理方法呢。

最終的解決方法:

private void button1_Click(object sender, EventArgs e)
        {
            var th = new Thread(() =>
            {
                //label1.Enabled = false;
                label1.CrossThreadCalls(() => { label1.Enabled = !label1.Enabled; });
                WriteMessage(DateTime.Now.ToString());
            });
            th.IsBackground = true;
            th.Start();
        }


        public void WriteMessage(string msg)
        {
            label1.CrossThreadCalls(() =>
            {
                label1.Text = msg;
            });
        }

在使用前,我們新建一個類。

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

namespace WindowsFormsApplication1
{
   public static class Class1
    {
       /// <summary>
       /// 跨線程訪問控制項 在控制項上執行委托
       /// </summary>
       /// <param name="ctl">控制項</param>
       /// <param name="del">執行的委托</param>
       public static void CrossThreadCalls(this Control ctl, ThreadStart del)
       {
           if (del == null) return;
           if (ctl.InvokeRequired)
               ctl.Invoke(del, null);
           else
               del();
       }
    }
}

  

最終,我們得出了這種解決方法。還算是不錯。 

 

我只是在學習過程中記錄,歡迎大家探討

 

原文地址:http://www.lazyw.org/weituo.html


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

-Advertisement-
Play Games
更多相關文章
  • 規劃許可權管理至少實現菜單許可權、界面許可權、動作許可權(按鈕)、服務許可權。 研究如何實現數據許可權等細粒度許可權。 (1)系統菜單管理 EF架構~性能高效的批量操作(Insert篇) ...
  • 當我第一次添加滾動條時候,我發現滾動條總是跑向上方,經過研究 解決方案如下: this.textBox1.Focus(); 獲取焦點 this.textBox1.Select(this.textBox1.textLength,0); 選擇到最後一行文本 this.textBox1.ScrollToC ...
  • Problem Description potato老師雖然很喜歡教書,但是迫於生活壓力,不得不想辦法在業餘時間掙點外快以養家糊口。“做什麼比較掙錢呢?篩沙子沒力氣,看大門又不夠帥...”potato老師很是無奈。“張藝謀比你還難看,現在多有錢呀,聽說還要導演奧運開幕式呢!你為什麼不去娛樂圈發展呢? ...
  • 主要改動部分: /// <summary> /// 6.創建工廠方法模式(抽象工廠:介面) /// </summary> interface IFactory //父介面(父類工廠) { /// <summary> /// 此父介面提供一個無參的函數方法 /// </summary> /// <re ...
  • 目的:1 學習mvc+ef 2 寫下日記也是對自己的督促 第0課 從0開始 ASP.NET MVC開發模式和傳統的WebForm開發模式相比,增加了很多"約定"。 直接講這些 "約定" 會讓人困惑,而且東西太多容易忘記。 和微軟官方教程不同,筆者儘量不用腳手架,從空白框架開始,一步一步添加功能,每次 ...
  • 提取文本的情況在工作和學習中常會遇到,在前面的文章中,已經講述瞭如何提取PPT中文本框里的文本,在本篇文章中,將介紹如何使用C#代碼語言提取PPT文檔中SmartArt和批註中的文本。同樣的,程式裡面需要使用到Spire.PPT for .NET,在編寫代碼前,需先安裝,並添引用dll文件到項目程式 ...
  • 新開一個Web site。沒有使用jQuery,當Insus.NET使用一些驗證控制項時,如RequiredfieldValidator,程式出現下麵錯誤: WebForms UnobtrusiveValidationMode requires a ScriptResourceMapping for ...
  • Dapper使用技巧和基礎CRUD 一、使用模型的增刪改查。 2.建立資料庫 3.數據增刪改查 引用比較亂,做了一些測試,順便說說MongoDB.Driver也很好用,下次寫。 備註:傳入參數可以直接用模型,也可以用object new {Name="test",Code="Test"};這是我寫這 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...