
请记住,当我在大二的时候,我正在和老师一起做一个项目. 那时,我是编程的新手,但是技术很糟糕. 那时,有一个功能可以将shapfile文件中的属性表导出为本地Excel(* xls)格式. 考虑到我是否可以制作一个进度条来改善用户体验,我很兴奋地将进度条拖到窗口中(这是最好的),然后将各种汤汤拖到最后c#进度条实现,终于意识到了c#进度条实现,但发现只有当表当记录很少时,进度条可以实时更新. 否则,当有许多记录时,直到完成导出后进度条直接充满血液,进度条才会更新. 当时,这是非常忧郁的. 百度和谷歌了解到这叫做“ UI阻止”,我必须打开另一个线程来解决它. 现在我更加忧郁. 那时,我“闻到线程变色”. 我不能做这种“黑科技”! ! !
namespace Progress
{
public delegate void SetProgressValueEventHandler(int pos);//设置进度值的委托 定义参数列表
}

namespace Progress
{
public partial class MainFrm : Form
{
public event SetProgressValueEventHandler SetProgressValueEvent;//定义事件用于回调
public Thread ProcessThread //定义子线程用于处理耗时任务
{
get;
set;
}
public MainFrm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ProcessThread = new Thread(new ThreadStart(HandleThread));//子线程初始化
ProgressFrm pFrm = new ProgressFrm(this);
ProcessThread.Start();//开启线程
pFrm.Show();
}
private void HandleThread()//线程处理函数,实现耗时任务
{
Run run = new Run();
run.RunProgress(150, SetProgressValueEvent);
}
}
}
class Run
{
public void RunProgress(int range, SetProgressValueEventHandler setProgressBar)
{
try
{
for (int i = 0; i < range; i++)
{
Thread.Sleep(100);
//int p = 10 / (i - 10);//此处为了验证程序错误响应处理,当i=10时触发异常
setProgressBar(i * 100 / range);
}
setProgressBar(100);//耗时任务结束,进度条达到100;
}
catch (System.Exception ex)
{
System.Console.WriteLine(ex.Message);
setProgressBar(101);//处理任务失败,向进度窗口传递消息传递值大于100或小于0的数
}
}
}

namespace Progress
{
public partial class ProgressFrm : Form
{
private MainFrm mFrm;
public ProgressFrm(MainFrm mFrm)
{
InitializeComponent();
this.mFrm = mFrm;
//绑定事件处理函数
mFrm.SetProgressValueEvent += new SetProgressValueEventHandler(OnProgressValueChanged);
}
private void OnProgressValueChanged(int pos)//事件处理函数,设置进度条和进度值
{
SetProgressBarValueInvoke(pos);
SetProgressLabelValueInvoke(pos);
}
private void SetProgressBarValueInvoke(int pos)//跨线程调用
{
if (progressBar.InvokeRequired)
{
SetProgressValueEventHandler setProgress = new SetProgressValueEventHandler(SetProgressBarValue);
progressBar.Invoke(setProgress, new object[] { pos });
}
else
{
SetProgressBarValue(pos);
}
}
private void SetProgressBarValue(int pos)
{
//this.progressBar.Value = pos;
if (pos <= progressBar.Maximum && pos >= 0)
{
this.progressBar.Value = pos;
}
}
private void SetProgressLabelValueInvoke(int pos)//跨线程调用
{
if (label.InvokeRequired)
{
SetProgressValueEventHandler setProgressLabel = new SetProgressValueEventHandler(SetProgressLabelValue);
progressBar.Invoke(setProgressLabel, new object[] { pos });
}
else
{
SetProgressBarLabelvalue(pos);
}
}
private void SetProgressLabelValue(int pos)
{
if (pos <= progressBar.Maximum && pos >=0)
{
if (pos == progressBar.Maximum)
{
MessageBox.Show("处理成功···", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
}
else
{
this.label.Text = pos.ToString() + "%";
}
}
else
{
MessageBox.Show("处理失败···", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
}
}
private void ProgressFrm_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
mFrm.SetProgressValueEvent -= new SetProgressValueEventHandler(OnProgressValueChanged);
mFrm.ProcessThread.Abort();
}
catch (System.Exception ex)
{
}
}
}
}
现在正在研究C#,该项目要求不经常使用C#,但是我想说的是,尽管C#的语法比C ++容易得多(这证明了为什么很批评C#),原因是因为微软把太多东西封装了,尽管语法很容易,但确实包含了更深层的思想.

封装意味着抽象,这意味着需要理解更多的哲学思想. -室友(江弟兄)
对我来说,它是委托/事件对C ++函数指针的封装. 要花很长时间才能理解.

**能力有限,请批评并指正我**
C#进度条实现源代码
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-196664-1.html
象是给美国出一出气
西方列强普遍认为北阳水师可以轻松战胜日本海军