国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C#線程間操作無(wú)效:從不是創(chuàng)建控件“textbox1”的線程訪問(wèn)它

這篇具有很好參考價(jià)值的文章主要介紹了C#線程間操作無(wú)效:從不是創(chuàng)建控件“textbox1”的線程訪問(wèn)它。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

  在C#的多線程訪問(wèn)中,在線程間的相互訪問(wèn)時(shí)因?yàn)榫€程安全問(wèn)題有訪問(wèn)限制,在創(chuàng)建一般線程時(shí),對(duì)于界面元素訪問(wèn)時(shí)這樣的問(wèn)題比較常見(jiàn)。

  比如,創(chuàng)建一個(gè)form1,上面放置一個(gè)textbox控件,創(chuàng)建一個(gè)線程去訪問(wèn)textbox,界面如下:

C#線程間操作無(wú)效:從不是創(chuàng)建控件“textbox1”的線程訪問(wèn)它

  按鈕buuton1的代碼:

        private void button1_Click(object sender, EventArgs e)
        {
            var thread1 = new System.Threading.Thread(Func1);
            thread1.Start();
        }

  就是簡(jiǎn)單地創(chuàng)建一個(gè)線程,線程里面運(yùn)行的func1代碼:

        private void Func1()
        {
            for(int i = 0; i < 5; i++)
            {
                textBox1.Text = textBox1.Text+ $"線程{Thread.CurrentThread.ManagedThreadId}執(zhí)行{i}."+Environment.NewLine;
            }
        }

  運(yùn)行,點(diǎn)擊button1按鈕系統(tǒng)會(huì)報(bào)錯(cuò):

C#線程間操作無(wú)效:從不是創(chuàng)建控件“textbox1”的線程訪問(wèn)它

  意思是說(shuō):線程間操作無(wú)效:從不是創(chuàng)建控件“textbox1”的線程訪問(wèn)它,這是不允許的。

  線程存在安全保護(hù)機(jī)制,并不能隨意訪問(wèn),因?yàn)檫@樣存在沖突的可能。

  解決這個(gè)問(wèn)題,最直接的方法是在界面初始化后去掉控件的跨線程非法訪問(wèn)屬性,即將Control.CheckForIllegalCrossThreadCalls屬性設(shè)置為false即可。

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

  這樣結(jié)果就出來(lái)了。

  一般情況下,還是不要設(shè)置Control.CheckForIllegalCrossThreadCalls的屬性,那么怎樣可以達(dá)到修改textbox1的值呢?

  可以通過(guò)委托來(lái)解決。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var thread1 = new System.Threading.Thread(Func1);
            thread1.Start();
        }

        public void SetText(string SText)
        {
            textBox1.Text = textBox1.Text + SText + Environment.NewLine;
        }

        private void Func1()
        {
            string Str = "";
            for (int i = 0; i < 5; i++)
            {
                Str= $"線程{Thread.CurrentThread.ManagedThreadId}執(zhí)行{i}."+Environment.NewLine;
                if (textBox1.InvokeRequired)
                {
                    Action SetText111 = delegate { SetText(Str); };
                    textBox1.Invoke(SetText111);
                }
                else
                {
                    textBox1.Text = Str;
                }
            }
        }
    }

  這樣也可以達(dá)到目的,或者直接寫(xiě)更簡(jiǎn)單:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var thread1 = new System.Threading.Thread(Func2);
            thread1.Start();
        }

        private void Func2()
        {
            textBox1.Invoke(() =>
            {
                for (int i = 0; i < 5; i++)
                {
                    textBox1.Text = textBox1.Text+ $"線程{Thread.CurrentThread.ManagedThreadId}執(zhí)行{i}." + Environment.NewLine;
                }
            });
        }

    }

  效果也是一樣的。

  在C#中,需要注意Invoke和begininvoke的區(qū)別。

  control.invoke(參數(shù)delegate):在擁有此控件的基礎(chǔ)窗口句柄的線程上執(zhí)行指定的委托,注意是同步。
  control.begininvoke(參數(shù)delegate):在創(chuàng)建控件的基礎(chǔ)句柄所在線程上異步執(zhí)行指定委托,注意這里執(zhí)行的是異步。

  在跨線程請(qǐng)求時(shí),常檢驗(yàn)textBox1.InvokeRequired屬性,即是否跨線程請(qǐng)求。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-407130.html

到了這里,關(guān)于C#線程間操作無(wú)效:從不是創(chuàng)建控件“textbox1”的線程訪問(wèn)它的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C#線程操作UI控件

    C#線程操作UI控件

    在寫(xiě)winform程序時(shí)候,如果時(shí)間長(zhǎng)的操作不用線程操作。那么會(huì)卡死UI,點(diǎn)擊界面就體現(xiàn)為未響應(yīng)。為此需要對(duì)耗時(shí)操作用線程處理,比如檢驗(yàn)的監(jiān)聽(tīng)程序就是一個(gè)死循環(huán),不停檢查文件夾或數(shù)據(jù)庫(kù)又沒(méi)有數(shù)據(jù),然后上傳。如果不時(shí)有線程,在數(shù)據(jù)多的情況,程序是基本點(diǎn)不動(dòng)

    2024年02月13日
    瀏覽(20)
  • C# 跨線程訪問(wèn)窗體控件

    C# 跨線程訪問(wèn)窗體控件

    在不加任何修飾的情況下,C# 默認(rèn)不允許跨線程訪問(wèn)控件,實(shí)際在項(xiàng)目開(kāi)發(fā)過(guò)程中,經(jīng)常使用跨線程操作控件屬性,需要設(shè)置相關(guān)屬性才能正確使用,兩種方法設(shè)置如下: 方法1:告訴編譯器取消跨線程訪問(wèn)檢查,在窗體構(gòu)造函數(shù)中編寫(xiě),如下圖所示: 方法2:設(shè)置所需的控件

    2024年02月11日
    瀏覽(25)
  • c# 跨線程訪問(wèn)UI控件

    ? ? ? ? 在一個(gè)應(yīng)用程序中,往往存在兩種線程:UI線程和工作線程。 ? ? ? ? UI線程有窗口,創(chuàng)建窗口的控件,且有消息隊(duì)列對(duì)窗口和控件的消息進(jìn)行管理。主要處理和UI相關(guān)的邏輯。 ? ? ? ? 工作線程主要處理和業(yè)務(wù)相關(guān)的比較復(fù)雜的邏輯,當(dāng)處理好之后有可能會(huì)調(diào)用U

    2024年02月08日
    瀏覽(24)
  • C# WinForm 跨線程訪問(wèn)控件

    C# WinForm 跨線程訪問(wèn)控件

    在WinForm開(kāi)發(fā)中,經(jīng)常會(huì)碰到主線程代碼運(yùn)行過(guò)程中需要刷新窗體控件的情況,如果直接在其他線程中去操作窗體控件,這時(shí)會(huì)拋出線程間操作無(wú)效的異常信息,因?yàn)榇绑w控件是由主線程創(chuàng)建的,C#強(qiáng)制要求代碼必須是線程安全的,所以不允許跨線程訪問(wèn)。需要使用控件的Inv

    2024年02月04日
    瀏覽(24)
  • WPF開(kāi)發(fā)經(jīng)驗(yàn)-WPF的TextBox控件的MouseDown事件不響應(yīng)的解決方法

    WPF開(kāi)發(fā)經(jīng)驗(yàn)-WPF的TextBox控件的MouseDown事件不響應(yīng)的解決方法

    最近項(xiàng)目有個(gè)需求,大概是,當(dāng)點(diǎn)擊某個(gè)TextBox時(shí),先執(zhí)行一些業(yè)務(wù)上的邏輯處理。 于是按以往思維,將TextBox的MouseDown事件關(guān)聯(lián)事件處理方法,將業(yè)務(wù)處理寫(xiě)在方法里。 調(diào)試發(fā)現(xiàn),點(diǎn)擊TextBox時(shí),事件處理方法未執(zhí)行。 通過(guò)查閱微軟官方文檔了解到問(wèn)題原因。 附上文檔鏈接:

    2024年02月08日
    瀏覽(30)
  • C#簡(jiǎn)單向:textbox添加提示內(nèi)容

    C#簡(jiǎn)單向:textbox添加提示內(nèi)容

    首先: 1.到所要操作的文件(/xx.cs/xx.Designer.cs),這里我是到Form3.cs/Form3.Designer.cs文件 2.找到你所要操作的textBox,樓主是叫textBox1的textBox,如果你們沒(méi)有修改名字的話,應(yīng)該也是什么textBox后面加數(shù)學(xué)什么的。 3.在該textBox下添加 4.到Form3.cs,創(chuàng)建這兩個(gè)方法 注意點(diǎn):這兩個(gè)方法與

    2024年02月09日
    瀏覽(17)
  • C# textBox 右鍵菜單 contextMenuStrip

    C# textBox 右鍵菜單 contextMenuStrip

    需求: 想在上圖空白處可以右鍵彈出菜單,該怎么做呢? 1.首先,拖出一個(gè) ContextMenuStrip。 ?隨便放哪里都行,如下: ?2.在textBox里關(guān)聯(lián)這個(gè)“右鍵控件”即可,如下: ?最終效果如下: 以上?參考:C# 右鍵菜單 contextMenuStrip_camellias_的博客-CSDN博客 3.添加響應(yīng)代碼: 如圖,雙擊

    2024年02月11日
    瀏覽(13)
  • c#入門-Task創(chuàng)建線程

    在c#中,有線程類。激活線程對(duì)象就可以實(shí)現(xiàn)多線程。 不過(guò),這是在代碼角度來(lái)說(shuō)的。你可以在代碼中創(chuàng)建一萬(wàn)個(gè)線程。 但實(shí)際上你的cpu沒(méi)有一萬(wàn)個(gè)邏輯處理器來(lái)真正同時(shí)執(zhí)行這一萬(wàn)個(gè)線程。 所以我們稱創(chuàng)建一萬(wàn)個(gè)線程為創(chuàng)建一萬(wàn)個(gè)并發(fā)——我們希望同時(shí)執(zhí)行一萬(wàn)個(gè)線程,

    2024年02月01日
    瀏覽(23)
  • C#調(diào)用SqlSugar操作達(dá)夢(mèng)數(shù)據(jù)庫(kù)報(bào)錯(cuò)“無(wú)效的表或視圖名”

    C#調(diào)用SqlSugar操作達(dá)夢(mèng)數(shù)據(jù)庫(kù)報(bào)錯(cuò)“無(wú)效的表或視圖名”

    ??安裝達(dá)夢(mèng)數(shù)據(jù)庫(kù)后,使用SqlSugar連接測(cè)試數(shù)據(jù)庫(kù)并基于DBFirst方式創(chuàng)建數(shù)據(jù)庫(kù)表對(duì)應(yīng)的類,主要代碼如下: ??運(yùn)行到CreateClassFile函數(shù)時(shí)報(bào)如下錯(cuò)誤: ??通過(guò)達(dá)夢(mèng)管理工具查看數(shù)據(jù)庫(kù),PERSON數(shù)據(jù)庫(kù)下有ADDRESS表,不清楚為什么報(bào)錯(cuò)。 ??百度錯(cuò)誤信息,檢索結(jié)果中介紹可

    2024年01月25日
    瀏覽(21)
  • 【W(wǎng)inForm詳細(xì)教程一】WinForm中的窗體、Label、TextBox及Button控件、RadioButton和CheckBox、ListBox

    【W(wǎng)inForm詳細(xì)教程一】WinForm中的窗體、Label、TextBox及Button控件、RadioButton和CheckBox、ListBox

    .sln文件 :解決方案文件 位置引用 bin文件夾 : 存放項(xiàng)目的編譯結(jié)果 exe dll debug 調(diào)試 release 發(fā)布 pdb 位置信息–調(diào)試 obj文件夾 object 編譯過(guò)程中生成的中間臨時(shí)文件 加快編譯速度 Properties 引用 添加引用 --選擇需要的程序集 App.config 配置文件 .csproj 項(xiàng)目文件 位置引用 雙擊打開(kāi)

    2024年02月08日
    瀏覽(57)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包