C# C中的进度条和backgroundworker#
目前我正在从事一个项目,该项目需要消耗来自web服务的大量数据, 服务类向服务器发送输入日期并返回结果, 由于it流程耗时,需要用户组合progressbar和backgroundworker向用户显示流程百分比。我浏览了很多关于这个主题的示例代码,但仍然无法找到最好的方法。你能帮忙吗, 我的代码如下:C# C中的进度条和backgroundworker#,c#,multithreading,progress-bar,backgroundworker,C#,Multithreading,Progress Bar,Backgroundworker,目前我正在从事一个项目,该项目需要消耗来自web服务的大量数据, 服务类向服务器发送输入日期并返回结果, 由于it流程耗时,需要用户组合progressbar和backgroundworker向用户显示流程百分比。我浏览了很多关于这个主题的示例代码,但仍然无法找到最好的方法。你能帮忙吗, 我的代码如下: private MyCollection[] callWebService(string[] Inputs, string method) { List<string> r
private MyCollection[] callWebService(string[] Inputs, string method)
{
List<string> results = new List<string>();
string fiel dNames = ""; // todo - fix this if nothing left in loop
int sizeOfArray = 500;
for (int i = 0; i < Inputs.Length; i = i + sizeOfArray)
{
string[] outputRecords;
int errorCode;
string errorString;
string[] thisFiveHundred = createSubArray(Inputs, i, sizeOfArray);
iq.NameValuePair[] namevaluepairs = new iq.NameValuePair[0];
fieldNames = iqOfficeWebservice.BatchStan(method, thisFiveHundred, null, "", out outputRecords, out errorCode, out errorString);
results.AddRange(outputRecords);
}
results.ToArray();
IAddress[] formattedResults = convertStringsToInputs(fieldNames, results);
return formattedResults;
}
private MyCollection[]callWebService(string[]输入,string方法)
{
列表结果=新列表();
字符串fiel dNames=“”;//todo-如果循环中没有任何内容,请修复此问题
int-sizeOfArray=500;
对于(int i=0;i
private void cmdButton\u单击(对象发送者,事件参数e)
{
BackgroundWorker工人=新的BackgroundWorker();
worker.WorkerReportsProgress=true;
worker.DoWork+=新的doworkereventhandler(worker\u DoWork);
worker.ProgressChanged+=新的progresschangedventhadler(worker\u ProgressChanged);
worker.RunWorkerAsync();
}
私有void worker_DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker worker=发件人作为BackgroundWorker;
对于(int i=0;i<101;i++)
{
工人进度报告(一);
系统线程线程睡眠(1000);
}
}
私有void worker\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
lblProgress.Text=(“进度:+e.ProgressPercentage.ToString()+“%”);
}
可以找到其他信息。private void cmdButton\u单击(对象发送者,事件参数e)
{
BackgroundWorker工人=新的BackgroundWorker();
worker.WorkerReportsProgress=true;
worker.DoWork+=新的doworkereventhandler(worker\u DoWork);
worker.ProgressChanged+=新的progresschangedventhadler(worker\u ProgressChanged);
worker.RunWorkerAsync();
}
私有void worker_DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker worker=发件人作为BackgroundWorker;
对于(int i=0;i<101;i++)
{
工人进度报告(一);
系统线程线程睡眠(1000);
}
}
私有void worker\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
lblProgress.Text=(“进度:+e.ProgressPercentage.ToString()+“%”);
}
附加信息可以找到。
< P>除了WPF或WiFrand中的技术实现,例如有一个基本方面要考虑。- 您是否从web服务获得进度反馈
isindedite
标志集(WPF)的进度,以显示持续的进度反馈。当您使用后台线程时,sandhour光标不是一个选项
另一种方法是将大的请求分解成更小的部分,以便可以报告进度。
< P>除了WPF或WiFrand中的技术实现外,还有一个重要的方面要考虑。- 您是否从web服务获得进度反馈
isindedite
标志集(WPF)的进度,以显示持续的进度反馈。当您使用后台线程时,sandhour光标不是一个选项
另一种方法是将大请求分解为更小的部分,以便报告进度。我刚刚整理了Adil答案的一个变体,它封装了工作和更新,并正确地分离事件和处理工作人员。如果你对我的答案投赞成票,请对阿迪尔的答案投赞成票
private void cmdButton_Click(object sender, EventArgs e)
{
var worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
DoWorkEventHandler doWork = (dws, dwe) =>
{
for (int i = 0; i < 101; i++)
{
worker.ReportProgress(i);
System.Threading.Thread.Sleep(100);
}
};
ProgressChangedEventHandler progressChanged = (pcs, pce) =>
{
lblProgress.Text = String.Format("Progress: {0}%", pce.ProgressPercentage);
};
RunWorkerCompletedEventHandler runWorkerCompleted = null;
runWorkerCompleted = (rwcs, rwce) =>
{
worker.DoWork -= doWork;
worker.ProgressChanged -= progressChanged;
worker.RunWorkerCompleted -= runWorkerCompleted;
worker.Dispose();
lblProgress.Text = "Done.";
};
worker.DoWork += doWork;
worker.ProgressChanged += progressChanged;
worker.RunWorkerCompleted += runWorkerCompleted;
worker.RunWorkerAsync();
}
private void cmdButton\u单击(对象发送者,事件参数e)
{
var worker=新的BackgroundWorker();
worker.WorkerReportsProgress=true;
榫头榫头榫头=(dws,dwe)=>
{
对于(int i=0;i<101;i++)
{
工人进度报告(一);
系统线程线程睡眠(100);
}
};
ProgressChangedEventHandler progressChanged=(个人电脑,个人电脑)=>
{
lblProgress.Text=String.Format(“进度:{0}%”,pce.ProgressPercentage);
};
RunWorkerCompletedEventHandler runWorkerCompleted=null;
runWorkerCompleted=(rwcs、rwce)=>
{
worker.DoWork-=DoWork;
worker.ProgressChanged-=ProgressChanged;
worker.RunWorkerCompleted-=RunWorkerCompleted;
worker.Dispose();
lblProgress.Text=“完成。”;
};
private void cmdButton_Click(object sender, EventArgs e)
{
var worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
DoWorkEventHandler doWork = (dws, dwe) =>
{
for (int i = 0; i < 101; i++)
{
worker.ReportProgress(i);
System.Threading.Thread.Sleep(100);
}
};
ProgressChangedEventHandler progressChanged = (pcs, pce) =>
{
lblProgress.Text = String.Format("Progress: {0}%", pce.ProgressPercentage);
};
RunWorkerCompletedEventHandler runWorkerCompleted = null;
runWorkerCompleted = (rwcs, rwce) =>
{
worker.DoWork -= doWork;
worker.ProgressChanged -= progressChanged;
worker.RunWorkerCompleted -= runWorkerCompleted;
worker.Dispose();
lblProgress.Text = "Done.";
};
worker.DoWork += doWork;
worker.ProgressChanged += progressChanged;
worker.RunWorkerCompleted += runWorkerCompleted;
worker.RunWorkerAsync();
}