我有一个类可以下载在控制台应用程序中运行的文件,现在我想在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触发器事件?
答案 0 :(得分:0)
WebClient
使用当前SynchronizationContext
将其事件发布到。您没有通过忙等待释放当前线程。我不知道你为什么要异步执行下载然后等待结果。这有什么用呢?只需使用同步API。
至少,不要旋转等待。使用WebAPI对IO的异步支持来摆脱等待循环。使用async和await。您可以在网上找到如何使用WebClient
完成此操作。
您对downloadFinished
的使用不是线程安全的。但是你无论如何都不需要这样的变量。