You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:15:30