winform应用中多线程界面的刷新问题(如何实现类似Splash屏)
正在做一个WinForm应用,里面不少地方需要添加进度条显示,比如:界面分3个区域,当其中某个区域加载数据时,就在这个区域的中央位置显示一个进度条(或者是动态图片都成),然后后面的界面(比如是个ListView控件)一直要加载数据,加载完成后进度条消失,我在网上查了很长时间,找到的方法都不能很好的解决,目前的主要问题就是:
当ListView在加载数据时,依然有界面停顿的情况,下面是我的程序(窗体上画一个按钮button2,一个ListView,一个进度条progressBar2),请大家帮忙看下,谢谢先
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace Test1
{
public partial class frmPgb : Form
{
public frmPgb()
{
InitializeComponent();
}
private ProgressHandler myProgress;
private RefreshHandler myLoadData;
private delegate void RefreshHandler();
private delegate void StopHandle();
private delegate void ProgressHandler(bool val);
private void button2_Click(object sender, EventArgs e)
{
//显示进度条
Thread th = new Thread(new ThreadStart(ShowProgressBar));
th.Start();
//加载大量数据
Thread th1 = new Thread(new ThreadStart(LoadData));
th1.Start();
//结束
Console.WriteLine("End............");
}
private void frmPgb_Load(object sender, EventArgs e)
{
this.myLoadData += new RefreshHandler(LoadData);
this.myProgress += new ProgressHandler(MangerProgressBar);
this.progressBar2.Visible = false;
this.progressBar2.Style = ProgressBarStyle.Marquee;
}
//显示进度条
private void ShowProgressBar()
{
if (!this.progressBar2.InvokeRequired)
{
this.progressBar2.Visible = true;
}
else
{
this.BeginInvoke(this.myProgress, new object[] { true });
}
}
private void MangerProgressBar(bool val)
{
this.progressBar2.Visible = val;
}
//加载数据
private void LoadData()
{
if (!this.InvokeRequired)
{
for (long i = 0; i < 10000; i++)
{
listView1.Items.Add("item_" + i);
Console.WriteLine("i=" + i);
}
}
else
{
this.BeginInvoke(this.myLoadData);
}
}
}
}