在任务中等待的无“冻结”替代方案:Thread.Sleep的替代方案

5

我需要调用一个以下方式工作的web API:

  1. 上传一首歌曲
  2. 请求对该歌曲进行特定分析
  3. 等待进程完成
  4. 检索并返回结果

我在第三步遇到问题,我尝试了Thread.Sleep但这会冻结UI。

如何在任务中等待而不冻结UI?

public override async Task Execute(Progress<double> progress, string id)
{
    FileResponse upload = await Queries.FileUpload(id, FileName, progress);
    upload.ThrowIfUnsucessful();

    FileResponse analyze = await Queries.AnalyzeTempo(id, upload);
    analyze.ThrowIfUnsucessful();

    FileResponse status;
    do
    {
        status = await Queries.FileStatus(id, analyze);
        status.ThrowIfUnsucessful();
        Thread.Sleep(TimeSpan.FromSeconds(10));
    } while (status.File.Status != "ready");

    AnalyzeTempoResponse response = await Queries.FileDownload<AnalyzeTempoResponse>(id, status);
    response.ThrowIfUnsucessful();

    Action(response);
}

编辑:这是我给任务起的名称

async void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    var fileName = @"d:\DJ SRS-Say You Never Let Me Go.mp3";
    TempoAnalyzeTask task = new TempoAnalyzeTask(fileName, target);
    await task.Execute(new Progress<double>(ProgressHandler), Id);
}
private AnalyzeTempoResponse _response;

private void target(AnalyzeTempoResponse obj)
{
    _response = obj;
}

是的,我正在尝试弄清楚如何将您发送的链接翻译为“Task”而不是“BackgroundWorker”。 - aybe
1
@bzlm 我同意,但最好将其指向其中一个答案中展示如何使用 await Task.Delay(x) 的众多重复项之一。 - Scott Chamberlain
1个回答

8

若要最小化更改,请切换到 Task.Delayawait结果。这将不再在您等待 10 秒钟的同时阻止您的 UI,就像其他三个await一样。

FileResponse status;
do
{
    status = await Queries.FileStatus(id, analyze);
    status.ThrowIfUnsucessful();
    await Task.Delay(TimeSpan.FromSeconds(10));
} while (status.File.Status != "ready");

1
就是这样,谢谢! - aybe
我见过的最好的do/while示例。 - GFoley83

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接