C#异步多线程(访问主线程控件)
在多线程的情况下,其它线程无法直接调用到主线程上的控件,只能通过代理来实现主线程上控件的调用。
1、定义委托
// 执行任务的委托声明(解决长任务死假)
delegate void RunTaskDelegate(int seconds);
// 显示进度条的委托声明(跨线程调用控件)
delegate void ShowProgressDelegate(int totalStep, int currentStep);
2、定义方法
private void ShowProgress(int totalStep, int currentStep)
{
progressBar1.Maximum = totalStep;
progressBar1.Value = currentStep;
}
3、定义线程
private void RunTask(int seconds)
{
ShowProgressDelegate showProgress = new ShowProgressDelegate(ShowProgress);
for (int i = 0; i < seconds * 4; i++)
{
Thread.Sleep(250);
// 在基础窗口上调用显示进度条的委托
this.Invoke(showProgress, new object[] { seconds * 4, i + 1 });
}
}
4、执行
RunTaskDelegate runTask = new RunTaskDelegate(RunTask);
// 异步调用执行任务的委托
runTask.BeginInvoke(20, null, null);
1、定义委托
// 执行任务的委托声明(解决长任务死假)
delegate void RunTaskDelegate(int seconds);
// 显示进度条的委托声明(跨线程调用控件)
delegate void ShowProgressDelegate(int totalStep, int currentStep);
2、定义方法
private void ShowProgress(int totalStep, int currentStep)
{
progressBar1.Maximum = totalStep;
progressBar1.Value = currentStep;
}
3、定义线程
private void RunTask(int seconds)
{
ShowProgressDelegate showProgress = new ShowProgressDelegate(ShowProgress);
for (int i = 0; i < seconds * 4; i++)
{
Thread.Sleep(250);
// 在基础窗口上调用显示进度条的委托
this.Invoke(showProgress, new object[] { seconds * 4, i + 1 });
}
}
4、执行
RunTaskDelegate runTask = new RunTaskDelegate(RunTask);
// 异步调用执行任务的委托
runTask.BeginInvoke(20, null, null);