C# 后台忙时如何使用进度条
我想为我的应用程序设置一个进度条 我正在使用后台从我的服务器下载一些文件 如果我能为此设置一个进度条,那就太好了 我知道怎么用C# 后台忙时如何使用进度条,c#,winforms,progress-bar,C#,Winforms,Progress Bar,我想为我的应用程序设置一个进度条 我正在使用后台从我的服务器下载一些文件 如果我能为此设置一个进度条,那就太好了 我知道怎么用 ProgressBar.Value = 5; 还有更多 但我想用进度条。” 我正在使用此代码作为进度条 private void bgDownload_ProgressChanged(object sender, ProgressChangedEventArgs e) { this.downloadProgressBar.Value = e.ProgressP
ProgressBar.Value = 5;
还有更多
但我想用进度条。”
我正在使用此代码作为进度条
private void bgDownload_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.downloadProgressBar.Value = e.ProgressPercentage;
}
但它不起作用
谁能说我该怎么做呢
提前感谢如果您在后台进行处理,UI将在其完成之前不会更新 因此,您需要做的是创建一个单独的线程,处理将在其中进行,并在该线程内更新进度条。在主线程中,不要做任何事情 要从另一个线程中更新进度条,您需要一个委托(否则会出现运行时错误)
希望这能让您开始。您可以尝试使用BackgroundWorker下载一些文件 所以背景下载不会影响你的进程吧
private void btnDownLoad_Click(System.Object sender,
System.EventArgs e)
{
// Start the asynchronous operation.
backgroundWorkerDownLoadFile.RunWorkerAsync();
}
private void backgroundWorkerDownLoadFile_DoWork(object sender,
DoWorkEventArgs e)
{
// Get the File in Server.
}
我假设您使用的是后台工作程序组件。因此,您必须从backgroundworker的
DoWork
方法调用ReportProgress
方法,该方法应更新进度条。请在下面找到MSDN中有关ReportProgress方法的一些参考资料:
除了JKhuang写的内容之外,要更改进度条中的值,您需要添加 委托和回调函数
delegate void SetProgCallback(int newVal);
private void SetProgressbarValue(int newVal)
{
if (progbar.InvokeRequired)
{
SetProgCallback d = SetProgressbarValue;
Invoke(d, new object[] { newVal });
}
else
{
//insert your actual code here
}
}
下面是一个如何做到这一点的示例
public int ProgressBarPercentage { get; set; }
public string StatusMessage { get; set; }
public void StartDownload()
{
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Run clean up code here once complete (ie make sure progress bar is at 100 percent....
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = sender as BackgroundWorker;
// Download files here
List<string> filestoget = new List<string>();
filestoget.Add("File1");
filestoget.Add("File2");
filestoget.Add("File3");
filestoget.Add("File4");
filestoget.Add("File5");
foreach (string file in filestoget)
{
// Get File
// Report output
int progress = 0; // add soemthing here to calculate your progress
bw.ReportProgress(progress, string.Format("File {0} downloaded", file));
}
}
void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
ProgressBarPercentage = e.ProgressPercentage;
StatusMessage = e.UserState.ToString();
}
public int ProgressBarPercentage{get;set;}
公共字符串状态消息{get;set;}
public void StartDownload()
{
BackgroundWorker bw=新的BackgroundWorker();
bw.WorkerReportsProgress=true;
bw.ProgressChanged+=新的ProgressChangedEventHandler(bw\U ProgressChanged);
bw.DoWork+=新DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(bw\u RunWorkerCompleted);
RunWorkerAsync();
}
void bw_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
//完成后在此处运行清理代码(即确保进度条为100%。)。。。。
}
void bw_DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker bw=发送方作为BackgroundWorker;
//在这里下载文件
List filestoget=new List();
filestoget.Add(“File1”);
filestoget.Add(“File2”);
filestoget.Add(“File3”);
filestoget.Add(“File4”);
filestoget.Add(“File5”);
foreach(filestoget中的字符串文件)
{
//获取文件
//报告输出
int progress=0;//在此处添加soemthing以计算进度
ReportProgress(progress,string.Format(“文件{0}下载”,File));
}
}
void bw_ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
ProgressBarPercentage=e.ProgressPercentage;
StatusMessage=e.UserState.ToString();
}
你能给我提供一些代码吗?因为我不知道进度条,我刚刚看到它。这是不正确的。如果他是在后台这样做的(不同的线程)然后,只要使用BeginInvoke或BackGroundWorker Progress Changed事件将值传递给UI,UI就会更新。或者,您可以使用操作而不是委托.progbar.Invoke(新操作(SetProgressbarValue,新对象[]{newVal}));