当前位置: 首页 > news >正文

奥德贵阳网络推广公司/新乡网站优化公司推荐

奥德贵阳网络推广公司,新乡网站优化公司推荐,建立一个公司网站大约多少钱,网站建设与管理知识点为了让程序尽快响应用户操作,在开发Windows应用程序时经常会使用到线程。 对于耗时的操作如果不使用线程将会是UI界面长时间处于停滞状态,这种情况是用户非常不愿意看到的,在这种情况下我们希望使用线程来解决这个问题。 先看一段代码&#x…

    为了让程序尽快响应用户操作,在开发Windows应用程序时经常会使用到线程。

    对于耗时的操作如果不使用线程将会是UI界面长时间处于停滞状态,这种情况是用户非常不愿意看到的,在这种情况下我们希望使用线程来解决这个问题。

    先看一段代码:

 1 public partial class Form1 : Form
 2     {
 3         public Form1()
 4         {
 5             InitializeComponent();
 6         }
 7 
 8         private void btnStartThread_Click(object sender, EventArgs e)
 9         {
10             progressBar.Value = 0;
11             Thread thread = new Thread(new ThreadStart(Run));
12             thread.Start();
13         }
14 
15         private void Run()
16         {
17             while (progressBar.Value < progressBar.Maximum)
18             {
19                 progressBar.PerformStep();
20             }
21         }
22     }

    程序的界面中包含一个按钮和一个进度条。

    我们的本意是点击“启动”按钮来启动模拟一个操作,在进度条中显示操作的总体进度。不过如果我们真的点击“启动”按钮会很失望,因为它会抛出一个System.InvalidOperationException异常,异常描述就是“线程间操作无效: 从不是创建控件‘progressBar’的线程访问它。”

解决方案一:CheckForIllegalCrossThreadCalls属性   

    之所以会出现这样的情况是因为在.NET中做了限制,不允许在调试环境下使用线程访问并非它自己创建的UI控件,这么做可能是怕在多线程环境下对界面控件进行操作会出现不可预知的情况,如果开发者可以确认自己的代码操作界面不会出现问题,可以用比较简单的方法解决,那就是设置CheckForIllegalCrossThreadCalls这个静态属性,它默认是true,如果将其设为false的话,以后在多线程环境下操作界面也不会抛出异常了,我们上面的代码可以修改为:

public partial class Form1 : Form{public Form1(){InitializeComponent();}private void btnStartThread_Click(object sender, EventArgs e){progressBar.Value = 0;CheckForIllegalCrossThreadCalls = false;  //指示是否对错误线程的调用,即是否允许在创建UI的线程之外访问线程Thread thread = new Thread(new ThreadStart(Run));thread.Start();}private void Run(){while (progressBar.Value < progressBar.Maximum){progressBar.PerformStep();}}}

 

方案二:Invoke方法来操作界面

 public partial class Form1 : Form{//定义delegate以便Invoke时使用private delegate void SetProgressBarValue(int value);public Form1(){InitializeComponent();}private void btnStartThread2_Click(object sender, EventArgs e){progressBar.Value = 0;Thread thread = new Thread(new ThreadStart(RunWithInvoke));thread.Start();}//使用Invoke方法来设置进度条private void RunWithInvoke(){int value = progressBar.Value;while (value < progressBar.Maximum){//如果是跨线程调用if (InvokeRequired){this.Invoke(new SetProgressBarValue(SetProgressValue), ++value);}else{progressBar.Value = ++value;}}}//跟SetProgressBarValue委托相匹配的方法private void SetProgressValue(int value){//progressBar.PerformStep();progressBar.Value = value;}}

解决方案三:BackgroundWorker类操作界面

public partial class Form1 : Form{private BackgroundWorker backWorker;public Form1(){InitializeComponent();}private void btnBackgroundWorker_Click(object sender, EventArgs e){progressBar.Value = 0;backWorker = new BackgroundWorker();backWorker.DoWork += new DoWorkEventHandler(worker_DoWork);//当工作进度发生变化时执行的事件处理方法backWorker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);//当事件处理完毕后执行的方法backWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);backWorker.WorkerReportsProgress = true;//支持报告进度更新backWorker.WorkerSupportsCancellation = false;//不支持异步取消backWorker.RunWorkerAsync();//启动执行
btnBackgroundWorker.Enabled = false;}//当事件处理完毕后执行的方法void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){btnBackgroundWorker.Enabled = true;}//当工作进度发生变化时执行的事件处理方法void worker_ProgressChanged(object sender, ProgressChangedEventArgs e){//可以在这个方法中与界面进行通讯progressBar.Value = e.ProgressPercentage;}//开始启动工作时执行的事件处理方法void worker_DoWork(object sender, DoWorkEventArgs e){int value = progressBar.Value;while (value < progressBar.Maximum){backWorker.ReportProgress(++value);//汇报进度
            }}}

解决方案四:Timer方式

public partial class Form1 : Form{public Form1(){InitializeComponent();}//使用System.Windows.Forms.Timer来操作界面能private void btnTimer_Click(object sender, EventArgs e){progressBar.Value = 0;//注意在.net中有多个命名空间下存在Timer类,为了便于区别,使用了带命名空间形式System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();timer.Interval = 1;timer.Tick += new EventHandler(timer_Tick);timer.Enabled = true;}//Timer中要定期执行的方法void timer_Tick(object sender, EventArgs e){int value = progressBar.Value;if (value < progressBar.Maximum){progressBar.Value = value + 100;}}}

 

转载于:https://www.cnblogs.com/cyhv/p/3217264.html

http://www.lbrq.cn/news/829855.html

相关文章:

  • 网站建设狼雨/b2b网站大全
  • 怎么使用模板建设网站/市场营销师报名官网
  • 网站建设资源/seo信息优化
  • 西安政府网站建设公司/谷歌网页版入口
  • 郑州网站推广服务/怎么自己做一个网站平台
  • 店铺图片设计/zac seo博客
  • 做网站的ebay网/八戒
  • 广东建设网站/互联网营销方式
  • 长宁区网站建设网站/关键词提取
  • 做网站每个月可以赚多少/海南seo
  • 惠州网站小程序建设点/seo的名词解释
  • 海尔网站建设目的/想要网站导航推广
  • 用dw制作网站模板下载/怎么建个人网站
  • 自己做网站还是找网站建设公司好/seo发贴软件
  • 购物网站 开店/windows优化大师可以卸载吗
  • 物业网站开发/免费个人网站建设
  • 济南网站建设制作公司推荐/长沙seo网站管理
  • 套别人的网站模板/今日热点新闻事件2022
  • 东莞微网站建设/云南网络推广服务
  • 品牌网站建设搭建/百度推送
  • 新网站怎么做seo 风享/网站查询关键词排名软件
  • 自助 建网站/视频号视频下载助手app
  • 知名的网站建设/怎么优化网站关键词的方法
  • 大连市建委培训官方网站/怎样做网络推广挣钱
  • 怎么攻击php做的网站吗/百度关键词搜索工具
  • 咸阳市网站建设/seo软件下载
  • html做校园网站/客服外包
  • 口碑好的番禺网站建设/百度官网登录入口
  • 三端互通传奇手游找服网站/软文推广例子
  • 向客户介绍网站建设的话本/香港疫情最新消息
  • OpenCV特征点提取算法orb、surf、sift对比
  • 【逻辑回归】MAP - Charting Student Math Misunderstandings
  • Python MCP与Excel增强智能:构建下一代数据处理和自动化解决方案
  • [AI8051U入门第五步]modbus_RTU主机
  • 数据通信与计算机网络——模拟传输
  • 【iOS】消息传递和消息转发