线程下载文件C#
Thread to download files C#
我有线程问题,我有这段代码(示例):
private void button_Click(object sender, EventArgs e) {
ShowMessage("Starting Downloads...");
<more code>
StartDownloads();
RunFileDownload();
<more code>
}
private void StartDownloads() {
<more code>
for (int i=0; i<10; i++) {
ShowMessage("Downloading file: " + i);
Download(i);
<more code>
}
<more code>
}
问题是,当我按下按钮并开始下载时,消息没有显示...我尝试用线程修复它,如下所示:
private void button_Click(object sender, EventArgs e) {
ShowMessage("Starting Downloads...");
Thread t = new Thread(new ThreadStart(StartDownloads));
t.Start();
RunFileDownload();
}
但是RunFileDownload();函数在文件下载之前启动。我尝试用 "Thread.Join();" 解决这个问题,但还是没有显示消息(主线程已暂停)。
我想用多线程解决它 Thread.Join();但它效率不高,我会在主线程中遇到其他函数的问题。
我该如何解决这个问题?
谢谢。
编辑#2:
考虑这段代码:
private void Download() {
ShowMessage("Starting Downloads...");
Thread t = new Thread(new ThreadStart(StartDownloads));
ShowMessage("Downloads Finished..."); | not run until
RunFileDownload(); | finished
ShowMessage("Files Executed..."); | thread.
}
我怎么能期望线程在其余代码执行之前完成?
我尝试 Thread.Join();但它冻结了应用程序。
假设您可以访问 async
/await
,最简单的解决方案是:
private async void button_Click(object sender, EventArgs e)
{
ShowMessage("Starting Downloads...");
await StartDownloads(); //Return control until this method completes!
RunFileDownload();
}
请注意,带有 await
的例外情况可以说是不够友善。 请确保您使用的是正确的 try/catch 块,尤其是从 await
开始。 考虑使用此模式:Fire-and-forget with async vs "old async delegate" and reading this article.
请注意 StartDownloads
需要异步并且 return 需要 Task
才能工作。
除了该解决方案之外,您还需要线程在完成时调用回调或引发事件,这样您就可以 运行 RunFileDownload
。使用 BackgroundWorker
可以简化该过程。
我有线程问题,我有这段代码(示例):
private void button_Click(object sender, EventArgs e) {
ShowMessage("Starting Downloads...");
<more code>
StartDownloads();
RunFileDownload();
<more code>
}
private void StartDownloads() {
<more code>
for (int i=0; i<10; i++) {
ShowMessage("Downloading file: " + i);
Download(i);
<more code>
}
<more code>
}
问题是,当我按下按钮并开始下载时,消息没有显示...我尝试用线程修复它,如下所示:
private void button_Click(object sender, EventArgs e) {
ShowMessage("Starting Downloads...");
Thread t = new Thread(new ThreadStart(StartDownloads));
t.Start();
RunFileDownload();
}
但是RunFileDownload();函数在文件下载之前启动。我尝试用 "Thread.Join();" 解决这个问题,但还是没有显示消息(主线程已暂停)。
我想用多线程解决它 Thread.Join();但它效率不高,我会在主线程中遇到其他函数的问题。
我该如何解决这个问题? 谢谢。
编辑#2:
考虑这段代码:
private void Download() {
ShowMessage("Starting Downloads...");
Thread t = new Thread(new ThreadStart(StartDownloads));
ShowMessage("Downloads Finished..."); | not run until
RunFileDownload(); | finished
ShowMessage("Files Executed..."); | thread.
}
我怎么能期望线程在其余代码执行之前完成? 我尝试 Thread.Join();但它冻结了应用程序。
假设您可以访问 async
/await
,最简单的解决方案是:
private async void button_Click(object sender, EventArgs e)
{
ShowMessage("Starting Downloads...");
await StartDownloads(); //Return control until this method completes!
RunFileDownload();
}
请注意,带有 await
的例外情况可以说是不够友善。 请确保您使用的是正确的 try/catch 块,尤其是从 await
开始。 考虑使用此模式:Fire-and-forget with async vs "old async delegate" and reading this article.
请注意 StartDownloads
需要异步并且 return 需要 Task
才能工作。
除了该解决方案之外,您还需要线程在完成时调用回调或引发事件,这样您就可以 运行 RunFileDownload
。使用 BackgroundWorker
可以简化该过程。