所以我在C#,vs2010中有一个桌面应用程序编程。它只有2个文本框和一个按钮,它的作用是,我想输入一个链接,在第一个框中下载一个直接的exe文件,当我提交它,在下载时,我如何制作第二个文本框显示一定比例的下载。
如果这太难以解释,请不要担心,我特别想要的是,例如,如果我正在进行某种循环,就像我有两个列表框,加载了相同的文本文件,我想循环通过它检查重复,但在循环中,像一个状态类型思考,例如它可能是说“检查”,或“扫描(密码在这里)”或“现在寻找(密码)...”等。
答案 0 :(得分:1)
看一下BackgroundWorker课程。它将使您能够在单独的线程中运行下载过程,然后定期将进度报告回UI。
答案 1 :(得分:1)
您需要研究使用threading并运行异步进程。检查有关异步更新WinForms UI的this问题。此外,为了显示进度,您可能需要某种形式的进度条。 WinForms和WPF都有进度条控件,具体取决于您使用的是哪个。或者,请考虑使用Label或TextBlock而不是TextBox来显示百分比。
答案 2 :(得分:0)
这个问题实际上是两个问题。第一个是如何处理下载的报告进度。第二个是关于在不阻塞UI线程的情况下处理长时间运行操作的更一般的问题。
我会使用WebClient的DownloadFileAsync方法。假设你的URL的TextBox名为FileURL,你有一个名为DownloadProgress的ProgressBar和一个名为StartDownload的按钮,一个非常基本的实现可能是这样的:
private void StartDownload_Click(object sender, RoutedEventArgs e)
{
if (this.FileURL.Text.Trim() != "")
{
try
{
WebClient wc = new WebClient();
wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
//todo: handle mime-type and location to save to!
wc.DownloadFileAsync(new Uri(this.FileURL.Text), "SomeFileName.ext");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
//Set the progress bar back to nothing
if (MessageBox.Show("Download Completed!", "Finished!", MessageBoxButton.OK) == MessageBoxResult.OK)
{
this.DownloadProgress.Value = 0;
}
}
void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
//update the progress bar based on the percentage completed.
this.DownloadProgress.Value = (double)e.ProgressPercentage;
}
注意:您必须添加对System.Net
的引用才能使用WebClient
我认为您正在寻找一个BackgroundWorker
来处理循环中的进度。可以在MSDN上找到一个很好的起始示例。
然后,您将从BackgroundWorker报告进度并将其显示在表单上。
答案 3 :(得分:-1)
要访问文本框文本,您应该像这样:
myTextBox1.Text = "Scanning (whatever)";
然后您可以应用应用程序逻辑