线程下载文件C#
我有一个线程问题,我有以下代码(示例): 但是RunFileDownload();函数在下载文件之前启动。我尝试用“Thread.Join();”来解决这个问题,但还是没有显示消息(主线程已暂停) 我想用多线程和线程来解决它;但是它效率不高,我在主线程中的其他函数也会有问题 我怎样才能解决这个问题? 谢谢 编辑#2: 考虑到这一准则:线程下载文件C#,c#,multithreading,C#,Multithreading,我有一个线程问题,我有以下代码(示例): 但是RunFileDownload();函数在下载文件之前启动。我尝试用“Thread.Join();”来解决这个问题,但还是没有显示消息(主线程已暂停) 我想用多线程和线程来解决它;但是它效率不高,我在主线程中的其他函数也会有问题 我怎样才能解决这个问题? 谢谢 编辑#2: 考虑到这一准则: private void Download() { ShowMessage("Starting Downloads..."); Thread t
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();但它会冻结应用程序。假设您有权访问
异步
/等待
,最简单的解决方案是:
private async void button_Click(object sender, EventArgs e)
{
ShowMessage("Starting Downloads...");
await StartDownloads(); //Return control until this method completes!
RunFileDownload();
}
请注意,await
的异常可以说不太好<强>请确保您使用的是适当的尝试/ catch块,特别是从<代码>等待向前。< /强>考虑使用此模式:阅读此。
请注意,StartDownloads
需要异步,并返回一个任务
,才能工作
除此之外,您还需要线程在完成时调用回调或引发事件,以便运行
RunFileDownload
。使用BackgroundWorker
可以简化这一过程。您的代码中是否缺少一些{
?还要尝试使您使用的async
@MethodMan是的,对不起,我为本文编写了此代码,这是一个“示例”我在代码中找到了搜索信息。AsYNC/<代码>。我在这个话题上是新的。谢谢你可以考虑。或者<代码> WebClient <代码>类对于简单的HTTP事务非常有用。从来没有想过在按钮事件上使用异步。这很漂亮。cool@YoryeNathan平心而论,这是里德·科佩几周前教给我的一个把戏非常有用。@YoryeNathan别忘了async void
应该只用于这样的事件;当调用返回void
的方法时,应该返回一个任务,而不是void
,否则错误捕获就消失了。@barrickasync void
在需要“开火并忘记”时也非常有用方法,否则我同意you@AlexeiLevenkov在我与Reed的对话之后,我想告诉你一个最新情况,他在一个地方使用了async void
,作为Task
的扩展方法,它等待任务并捕获/记录任何异常。然后,他在返回异步的标准任务上调用该扩展方法,并将其转换进火忘法。
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.
}
private async void button_Click(object sender, EventArgs e)
{
ShowMessage("Starting Downloads...");
await StartDownloads(); //Return control until this method completes!
RunFileDownload();
}