如何在C# .NET中等待AltoHttp库的无返回值下载方法?
解决AltoHttp无法用await等待下载完成的问题
AltoHttp的HttpDownloader.Start()方法是无返回值的void类型,没法直接用await等待下载完成。我们可以通过TaskCompletionSource将下载完成事件包装成可等待的Task,实现类似WebClient的异步等待效果。
具体实现代码
public async Task DownloadWithAwaitAsync(Uri uri, string filename) { var httpdownloader = new HttpDownloader(uri, filename); var tcs = new TaskCompletionSource<bool>(); // 订阅下载完成事件,完成后解绑并标记任务结束 void DownloadCompletedHandler(object sender, EventArgs e) { httpdownloader.DownloadCompleted -= DownloadCompletedHandler; tcs.SetResult(true); } // 可选:订阅下载失败事件,捕获异常并标记任务失败 void DownloadFailedHandler(object sender, DownloadFailedEventArgs e) { httpdownloader.DownloadFailed -= DownloadFailedHandler; httpdownloader.DownloadCompleted -= DownloadCompletedHandler; tcs.SetException(e.Exception); } // 绑定各类事件 httpdownloader.DownloadCompleted += DownloadCompletedHandler; httpdownloader.DownloadFailed += DownloadFailedHandler; // 如果AltoHttp提供该事件 httpdownloader.ProgressChanged += httpdownloaderU_Progress; httpdownloader.StatusChanged += httpdownloader_StatusChanged; // 启动下载 httpdownloader.Start(); // 等待下载完成或失败 await tcs.Task; }
使用方式
调用这个封装后的异步方法,就能实现等待下载完成后再执行后续代码:
await DownloadWithAwaitAsync(yourUri, yourFilename); // 此处写下载完成后需要执行的代码
关键说明
TaskCompletionSource<bool>用来手动控制Task的完成状态:下载成功时调用SetResult标记任务完成,下载失败时调用SetException抛出异常。- 事件处理函数中必须解绑事件,避免内存泄漏。
- 如果AltoHttp没有提供
DownloadFailed事件,可以在DownloadCompleted事件中通过HttpDownloader的状态属性判断是否下载成功,再决定调用SetResult还是SetException。
内容的提问来源于stack exchange,提问作者Ahmed Tech 4U
相关产品推荐
相关产品推荐

