Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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# ApicController中的WebClient.DownloadFileAsync不会触发事件_C#_.net_Webclient_Asp.net Web Api2 - Fatal编程技术网

C# ApicController中的WebClient.DownloadFileAsync不会触发事件

C# ApicController中的WebClient.DownloadFileAsync不会触发事件,c#,.net,webclient,asp.net-web-api2,C#,.net,Webclient,Asp.net Web Api2,我有一个类可以下载在控制台应用程序中工作的文件,现在我想在webapi项目中使用它 下载我使用的文件 WebClient wc = new WebClient(); bool downloadFinished = false; wc.DownloadProgressChanged += (s, e) => { ProgressChanged(e.BytesReceived, e.TotalBytesToReceive, e.ProgressPercentage); }; wc.D

我有一个类可以下载在控制台应用程序中工作的文件,现在我想在webapi项目中使用它

下载我使用的文件

WebClient wc = new WebClient();
bool downloadFinished = false;

wc.DownloadProgressChanged += (s, e) =>
{
    ProgressChanged(e.BytesReceived, e.TotalBytesToReceive, e.ProgressPercentage);
};
wc.DownloadFileCompleted += (s, e) =>
{
    downloadFinished = true;
};

wc.DownloadFileAsync(new Uri(fileUrl), Path.Combine(DOWNLOADFOLDERTEMP, FileName));

while (!downloadFinished)
{
    System.Threading.Thread.Sleep(250);
}
它可以在控制台程序中工作,但不能在ApiController中工作。 它下载文件,但进程和完成的事件从未触发,导致无休止的循环

在ApiController中调用时,如何使WebClient触发事件?

WebClient使用当前SynchronizationContext将其事件发布到。您没有通过忙等待来释放当前线程。我不知道为什么要异步执行下载,然后等待结果。这有什么用?只需使用同步API

至少,不要旋转等待。使用WebAPI对异步到IO的支持来摆脱等待循环。使用异步和等待。您将在web上找到如何使用WebClient实现这一点


您对downloadFinished的使用不是线程安全的。但无论如何,您不应该需要这样一个变量。

WebClient同步下载文件不报告进度,这就是我使用DownloadFileAsync的原因。@elch OK,这很有意义。然后摆脱轮询循环并使用事件,或者更好地使用TaskCompletionSource等待。如果使用事件,则会出现相同的死锁问题。您可以在调用WebClient解决此问题时抑制同步上下文。使用Wait,您不会遇到任何类似的问题,但异步代码具有侵入性。我现在使用的是DownloadFileTaskAsync。将所有方法更改为异步,并在需要时等待。