一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - c#中Winform實現多線程異步更新UI(進度及狀態(tài)信息)

c#中Winform實現多線程異步更新UI(進度及狀態(tài)信息)

2021-12-27 14:49msay C#

本篇文章主要介紹了c#中Winform實現多線程異步更新UI(進度及狀態(tài)信息) ,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

引言

在進行winform程序開發(fā)需要進行大量的數據的讀寫操作的時候,往往會需要一定的時間,然在這個時間段里面,界面ui得不到更新,導致在用戶看來界面處于假死的狀態(tài),造成了不好的用戶體驗。所以在大量數據操作的應用上,需要使用多線程來處理這種情況。在c#中使用多線程很方便只需要使用system.threading.thread的一個實例的start方法就行了,但是如何實現多線程之間的交互就不是那么簡單。本文實現了用子線程去處理數據,并實時更新主線程的ui狀態(tài)了。下面就開始一步步的去實現異步線程更新ui的demo程序吧。

應用背景

寫入一定量的數據到文本文件中,同時需要在主界面中反應出寫入數據的實時進度情況。要求:需要將寫入數據封裝成一個類。

實現過程

1、首先建立一個winform項目,在主窗體上拖入一個button,一個progressbar,一個lable。如下圖所示。

c#中Winform實現多線程異步更新UI(進度及狀態(tài)信息)

2、編寫一個處理數據的類(writedate),源代碼如下。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class datawrite
{
 public delegate void updateui(int step);//聲明一個更新主線程的委托
 public updateui updateuidelegate;
 
 public delegate void accomplishtask();//聲明一個在完成任務時通知主線程的委托
 public accomplishtask taskcallback;
 
 public void write(object linecount)
 {
  streamwriter writeio = new streamwriter("text.txt", false, encoding.getencoding("gb2312"));
  string head = "編號,省,市";
  writeio.write(head);
  for (int i = 0; i < (int)linecount; i++)
  {
   writeio.writeline(i.tostring() + ",湖南,衡陽");
   //寫入一條數據,調用更新主線程ui狀態(tài)的委托
   updateuidelegate(1);
  }
  //任務完成時通知主線程作出相應的處理
  taskcallback();
  writeio.close();
 }
}

3、主界面中的代碼如下:

首先要建立一個委托來實現非創(chuàng)建控件的線程更新控件。

?
1
delegate void asynupdateui(int step);

然后編寫多線程去啟動寫入數據的方法以及回調的函數。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
private void btnwrite_click(object sender, eventargs e)
{
 int taskcount = 10000; //任務量為10000
 this.pgbwrite.maximum = taskcount;
 this.pgbwrite.value = 0;
 
 datawrite datawrite = new datawrite();//實例化一個寫入數據的類
 datawrite.updateuidelegate += updatauistatus;//綁定更新任務狀態(tài)的委托
 datawrite.taskcallback += accomplish;//綁定完成任務要調用的委托
 
 thread thread = new thread(new parameterizedthreadstart(datawrite.write));
 thread.isbackground = true;
 thread.start(taskcount);
}
 
//更新ui
private void updatauistatus(int step)
{
 if (invokerequired)
 {
  this.invoke(new asynupdateui(delegate(int s)
  {
   this.pgbwrite.value += s;
   this.lblwritestatus.text = this.pgbwrite.value.tostring() + "/" + this.pgbwrite.maximum.tostring();
  }), step);
 }
 else
 {
  this.pgbwrite.value += step;
  this.lblwritestatus.text = this.pgbwrite.value.tostring() + "/" + this.pgbwrite.maximum.tostring();
 }
}
 
//完成任務時需要調用
private void accomplish()
{
 //還可以進行其他的一些完任務完成之后的邏輯處理
 messagebox.show("任務完成");
}

效果如下:

c#中Winform實現多線程異步更新UI(進度及狀態(tài)信息)

總結

實現異步更新ui有很多種方法,但是我認為這種方式是比較靈活,能實時的獲取到任務進行的狀態(tài),并且對之進行相應的處理。這種模式還適用于使用多個線程同時寫入不同的數據到不同的文件中去。

源代碼下載地址:winform.rar

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/mingjiatang/p/5079632.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 特黄特色一级aa毛片免费观看 | 美女机机对机机的视频(免费) | 国内精品露脸在线视频播放 | 性欧洲女人18 | 亚欧洲乱码专区视频 | 韩国最新三级网站在线播放 | 天堂网在线.www天堂在线视频 | 被老头肉至怀孕小说 | 911色_911色sss在线观看 | 亚洲邪恶天堂影院在线观看 | 紧身裙女教师波多野结衣 | 热99re久久精品精品免费 | 国产欧美一区二区精品性色 | 九九热这里只有精品视频免费 | chanelpreston欧美网站| videos欧美肥婆 | 暖暖视频日本 | 国产美女久久久久 | 色综合亚洲天天综合网站 | 国产v日韩v欧美v精品专区 | 91亚洲精品久久91综合 | se婷婷| 精品国产美女AV久久久久 | 精品久久久久久国产 | 秋葵丝瓜茄子草莓榴莲樱桃 | www.日本在线播放 | 乌克兰xxxxx| 青青成人福利国产在线视频 | 国产精品麻豆 | 免费毛片在线观看 | 欧美成人tv在线观看免费 | 国产亚洲精品91 | 范冰冰a级一级特级毛片 | 女人和拘做受全过程免费 | 亚洲国产第一区二区三区 | 四虎国产成人免费观看 | 男人的天堂久久精品激情 | 激情视频网址 | 亚洲精品午夜在线观看 | 男女一级特黄a大片 | 亚洲spank男男实践网站 |