Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
线程下载文件C#_C#_Multithreading - Fatal编程技术网

线程下载文件C#

线程下载文件C#,c#,multithreading,C#,Multithreading,我有一个线程问题,我有以下代码(示例): 但是RunFileDownload();函数在下载文件之前启动。我尝试用“Thread.Join();”来解决这个问题,但还是没有显示消息(主线程已暂停) 我想用多线程和线程来解决它;但是它效率不高,我在主线程中的其他函数也会有问题 我怎样才能解决这个问题? 谢谢 编辑#2: 考虑到这一准则: private void Download() { ShowMessage("Starting Downloads..."); Thread t

我有一个线程问题,我有以下代码(示例):

但是RunFileDownload();函数在下载文件之前启动。我尝试用“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();但它会冻结应用程序。

假设您有权访问
异步
/
等待
,最简单的解决方案是:

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
,否则错误捕获就消失了。@barrick
async 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();
}