日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C# 多线程,解决处理大数据时窗体(不能拖动等)假死现象

發(fā)布時(shí)間:2025/3/13 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 多线程,解决处理大数据时窗体(不能拖动等)假死现象 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

using System.Threading;//引入命名空間

public partial class Form3 : Form
??? {
??????? public Form3()
??????? {
??????????? InitializeComponent();
??????? }
??????? // 第一種方法:
??????? delegate void MyDel(int i);//此處定義委托應(yīng)與方法HH的原型一致
??????? MyDel mydel = null;
??????? private void button1_Click(object sender, EventArgs e)
??????? {
??????????? mydel = new MyDel(HH);
??????????? Thread h = new Thread(new ThreadStart(World));
??????????? h.IsBackground = true;
??????????? h.Start();

??????? }
??????? void HH(int j)
??????? {
??????????? #region 錯(cuò)誤方法
??????????? //for (int i = 0; i <= j; i++)
??????????? //{
??????????? //??? Thread.Sleep(100);
??????????? //??? this.progressBar1.Value = i;
??????????? //??? if (i == 100)
??????????? //??? {
??????????? //??????? if(DialogResult.OK== MessageBox.Show("成功","測(cè)試",MessageBoxButtons.OKCancel,MessageBoxIcon.Question))
??????????? //??????? {
??????????? //??????????? this.Close();
??????????? //??????? }
??????????? //??? }
??????????? //}
??????????? #endregion
??????????? this.progressBar1.Value = j;
??????????? this.label1.Text = "當(dāng)前已完成" + j.ToString() + "%,請(qǐng)稍等……";
??????????? if (j == 100)
??????????? {
??????????????? this.Invoke(new MethodInvoker(delegate() { this.label1.Text = "完成"; }));
??????????????? if (DialogResult.OK == MessageBox.Show("成功2", "測(cè)試2", MessageBoxButtons.OKCancel, MessageBoxIcon.Question))
??????????????? {
??????????????????? this.Close();
??????????????? }
??????????? }

??????? }
??????? void World()
??????? {
??????????? mydel = new MyDel(HH);
??????????? for (int i = 0; i <= 100; i++)
??????????? {
??????????????? Thread.Sleep(100);
??????????????? BeginInvoke(mydel, new object[] { i });
??????????? }

??????? }

??????? //第二種方法
??????? private void button2_Click(object sender, EventArgs e)
??????? {
??????????? Thread t = new Thread(new ThreadStart(MessageShow));
??????????? t.IsBackground = true;
??????????? t.Start();
??????? }
??????? void MessageShow()
??????? {
??????????? for (int i = 0; i <= 100; i++)
??????????? {
??????????????? Thread.Sleep(100);
??????????????? this.Invoke(new MethodInvoker(delegate() { this.label3.Text = "當(dāng)前已完成" + i + "%,請(qǐng)稍等……"; }));

??????????????? if (i == 100)
??????????????? {
??????????????????? this.Invoke(new MethodInvoker(delegate()
??????????????????? {
??????????????????????? this.label3.Text = "完成";
??????????????????????? if (DialogResult.OK == MessageBox.Show("完成1", "完成1", MessageBoxButtons.OKCancel, MessageBoxIcon.Question))
??????????????????????? {
??????????????????????????? this.Close();
??????????????????????? }
??????????????????????? else
??????????????????????? {
??????????????????????? }
??????????????????? }));
??????????????? }
??????????????? this.Invoke(new MethodInvoker(delegate() { this.progressBar2.Value = i; }));
??????????? }
??????? }
??????
??????? //第三種方法
??????? private void button3_Click(object sender, EventArgs e)
??????? {
??????????? Thread th = new Thread(new ParameterizedThreadStart(GetPath));
??????????? th.IsBackground = true;
??????????? th.Start("100");
??????? }
??????? void GetPath(object str)
??????? {
??????????? int j = int.Parse(str.ToString());
??????????? for (int i = 0; i <= j; i++)
??????????? {
??????????????? Thread.Sleep(100);
??????????????? this.Invoke(new MethodInvoker(delegate() { this.progressBar3.Value = i; }));
??????????????? this.Invoke(new MethodInvoker(delegate() { this.label2.Text = "當(dāng)前已完成" + i.ToString() + "%,請(qǐng)稍等……"; }));
??????????????? if (i == 100)
??????????????? {
??????????????????? this.Invoke(new MethodInvoker(delegate() { this.label2.Text = "完成" ; }));
??????????????????? if (DialogResult.OK == MessageBox.Show("成功3", "測(cè)試3", MessageBoxButtons.OKCancel, MessageBoxIcon.Question))
??????????????????? {
??????????????????????? this.Close();
??????????????????? }
??????????????? }
??????????? }
??????? }//此方法必須是Object類(lèi)型的參數(shù)

??? }
}

?

?

另外說(shuō)明:

?

在多線程程序中,新創(chuàng)建的線程不能訪問(wèn)UI線程創(chuàng)建的窗口控件,如果需要訪問(wèn)窗口中的控件,可以在窗口構(gòu)造函數(shù)中將CheckForIllegalCrossThreadCalls設(shè)置為 false

public Form1() { ???

InitializeComponent(); ??

? CheckForIllegalCrossThreadCalls = false;

}

?

也可以針對(duì)某一控件進(jìn)行設(shè)置,例如:

??? TextBox.CheckForIllegalCrossThreadCalls = false;

轉(zhuǎn)載于:https://www.cnblogs.com/cbwbin/archive/2012/07/20/2601205.html

與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的C# 多线程,解决处理大数据时窗体(不能拖动等)假死现象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。