ApiController中的WebClient.DownloadFileAsync不会触发事件

时间:2014-09-14 12:07:34

标签: 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.DownloadFileCompleted += (s, e) =>
{
    downloadFinished = true;
};

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

while (!downloadFinished)
{
    System.Threading.Thread.Sleep(250);
}

哪个适用于控制台程序,但不适用于ApiController。 它会下载文件,但进度和已完成的事件永远不会触发,从而导致无限循环。

在ApiController中调用时如何制作WebClient触发器事件?

1 个答案:

答案 0 :(得分:0)

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

至少,不要旋转等待。使用WebAPI对IO的异步支持来摆脱等待循环。使用async和await。您可以在网上找到如何使用WebClient完成此操作。

您对downloadFinished的使用不是线程安全的。但是你无论如何都不需要这样的变量。