我这里有一个很长的方法,需要一段时间才能执行。我想让用户受理,所以我创建了一个进度条和一个标签。我希望在系统执行进度时更改标签。我一直在看Application.DoEvents(),但这似乎是错误的方法。这个应用程序非常简单,它只是一个项目,没有专业。所有这个应用程序都是将文件发送到客户端并将数据插入数据库。
我有一个标签(除了成功和错误标签),我希望不断更新进度条。有关如何执行此操作的任何想法或提示?在这种情况下,Application.DoEvents()是否可以接受?或者是否有一种更新文本的简单方法。我正在使用C#,asp.net和System.Web.UI.Page。任何帮助或指向我正确的方向将不胜感激。
protected void Button_Click(object sender, EventArgs e)
{
PutFTPButton.Enabled = false;
Thread.Sleep(3000);
Button btn = (Button)sender;
KaplanFTP.BatchFiles bf = new KaplanFTP.BatchFiles();
KaplanFTP.Transmit transmit = new KaplanFTP.Transmit();
//label text change here
if (btn.ID == PutFTPButton.ID)
{
//bf.ReadyFilesForTransmission();
DirectoryInfo dir = new DirectoryInfo(@"C:\Kaplan");
FileInfo[] BatchFiles = bf.GetBatchFiles(dir);
bool result = transmit.UploadBatchFilesToFTP(BatchFiles);
//label text change here
if (!result)
{
ErrorLabel.Text += KaplanFTP.errorMsg;
return;
}
bf.InsertBatchDataIntoDatabase("CTL");
bf.InsertBatchDataIntoDatabase("HDR");
bf.InsertBatchDataIntoDatabase("DET");
bf.InsertBatchDataIntoDatabase("NTS");
List<FileInfo> allfiles = BatchFiles.ToList<FileInfo>();
allfiles.AddRange(dir.GetFiles("*.txt"));
bf.MoveFiles(allfiles);
//label text change here
foreach (string order in bf.OrdersSent)
{
OrdersSentDiv.Controls.Add(new LiteralControl(order + "<br />"));
}
//lblWait.Visible = false;
OrdersSentDiv.Visible = true;
OrdersInfoDiv.Visible = false;
SuccessLabel.Visible = true;
NoBatchesToProcessLbl.Visible = true;
BatchesToProcessLbl.Visible = false;
PutFTPButton.Enabled = false;
BatchesCreatedLbl.Text = int.Parse(NextBatchNum).ToString();
Thread.Sleep(20000);
if (KaplanFTP.errorMsg.Length != 0)
{
ErrorLabel.Visible = true;
SuccessLabel.Visible = false;
ErrorLabel.Text = KaplanFTP.errorMsg;
}
}
}
答案 0 :(得分:3)
我认为您可以使用Ajax UpdateProgress控件,请检查Progress Bar on File Upload ASP.NET。
编辑:另一个Displaying Progress Bar For Long Running Processes using ASP.NET AJAX。
答案 1 :(得分:1)
delegate void SetTextCallback(string text);
private void SetText(string text)
{
if (this.label1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else this.label1.Text = text;
}
void SomeMethod()
{
SetText(yourVariable.ToString());
}
如果我理解正确,这应该有用。
答案 2 :(得分:0)
Application.DoEvents()在ASP.NET应用程序中不可用,随着多核处理器和.NET线程库的出现,它在标准的WinForms应用程序中也是不可接受的。
Web应用程序需要与服务器进行通信。因此,只需更新标签文本即可,除非您将其发送回客户端。在您的情况下,您需要一个由此行发出信号的事件(因为它是批量上传):
transmit.UploadBatchFilesToFTP(BatchFiles);
该事件将更新您要显示的值。然后,您需要在相关网页上使用一些AJAX代码(或围绕ASP.NET标签的ASP.NET更新面板)来获取并显示新值。
HTH