您的位置:首页 > 产品设计 > UI/UE

C#编程:多线程与UI操作

2014-10-18 20:17 344 查看
为了让程序尽快响应用户操作,在开发Windows应用程序时经常会使用到线程。对于耗时的操作如果不使用线程将会是UI界面长时间处于停滞状态,这种情况是用户非常不愿意看到的,在这种情况下我们希望使用线程来解决这个问题。

简单贴出几种处理情况的代码,慢慢琢磨吧!

[csharp] view
plaincopy

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Threading;

namespace ThreadPoolDemo

{

public partial class ThreadForm : Form

{

//定义delegate以便Invoke时使用

private delegate void SetProgressBarValue(int value);

private BackgroundWorker worker;

public ThreadForm()

{

InitializeComponent();

}

private void btnThread_Click(object sender, EventArgs e)

{

progressBar.Value = 0;

//指示是否对错误线程的调用,即是否允许在创建UI的线程之外访问线程

//CheckForIllegalCrossThreadCalls = false;

Thread thread = new Thread(new ThreadStart(Run));

thread.Start();

}

//使用线程来直接设置进度条

private void Run()

{

while (progressBar.Value < progressBar.Maximum)

{

progressBar.PerformStep();

}

}

private void btnInvoke_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.Value = value;

}

private void btnBackgroundWorker_Click(object sender, EventArgs e)

{

progressBar.Value = 0;

worker = new BackgroundWorker();

worker.DoWork += new DoWorkEventHandler(worker_DoWork);

//当工作进度发生变化时执行的事件处理方法

worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);

//当事件处理完毕后执行的方法

worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);

worker.WorkerReportsProgress = true;//支持报告进度更新

worker.WorkerSupportsCancellation = false;//不支持异步取消

worker.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)

{

worker.ReportProgress(++value);//汇报进度

}

}

//使用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;

}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: