最近项目中需要用到多线程调用进度条,用来显示文件拷贝或下载的进度,以前没有接触过多线程的实际应用,所以总是蹩手蹩脚的,好不容易实现了下面的多线程进度条,但是我想把它改进成,文件下载,拷贝,上传,请求webservice等工作都能调用的进度条窗体,现在还没有思路。

上代码:
1.WorkClass(实际完成工作的类):

Code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public class WorkClass
{
//委托
public delegate void dWorkProgress(int size,int current);
public delegate void dWorkDone();
//事件
public event dWorkProgress onWorkProgess;
//实际工作内容
public void Start()
{
for (int i = 0; i < 20; i++)
{
Thread.Sleep(250);
if (onWorkProgess != null)
{
onWorkProgess(20, i + 1);
}
}
}
}
2.PSWaitingForm(等待的UI)

Code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> public partial class PSWaitingForm : Form
{
private ThreadStart threadstart;
//工作线程
public Thread newThread;
public string Title
{
get { return this.Text; }
set { this.Text = value; }
}
public PSWaitingForm()
{
InitializeComponent();
}
public void StartWork()
{
WorkClass worker = new WorkClass();
worker.onWorkProgess += new WorkClass.dWorkProgress(worker_onWorkProgess);
//触发事件
worker.Start();
}
//当工作完成后关闭PSWaitingForm
void worker_onWorkDone()
{
this.Close();
}
//事件相应程序
void worker_onWorkProgess(int total, int current)
{
if (this.InvokeRequired)
{
//若工作完成则通过异步调用委托来关闭PSWaitingForm窗体
if (total == current)
{
this.BeginInvoke(new WorkClass.dWorkDone(worker_onWorkDone), null);
}
//工作过程中异步调用委托来显示实际工作的进度
this.BeginInvoke(new WorkClass.dWorkProgress(worker_onWorkProgess), new object[] { total, current });
}
else
{
progressBar1.Maximum = total;
progressBar1.Value = current;
}
}
private void PSWaitingForm_Load(object sender, EventArgs e)
{
threadstart = new ThreadStart(StartWork);
newThread = new Thread(threadstart);
}
//取消工作
private void button1_Click(object sender, EventArgs e)
{
if (newThread.IsAlive)
{
newThread.Abort();
this.Close();
}
}
}
现在如果将上述的方法运用到文件下载中可以,如果再应用到上传或者其他过程中,就要逐一地修改PSWaitingForm内的方法,感觉很不合理,我比较菜,恳请达人相助!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-555241/
,如需转载,请注明出处,否则将追究法律责任。