首页 > 解决方案 > 为什么 Dropbox API 的“DownloadAsync”方法在异步任务中运行时会冻结方法。C#

问题描述

因此,我在我的 C# 应用程序中使用 Dropbox API 来下载文件并检查字符串。以前,我一直使用“DownloadAsync”方法来下载文件并在“async void”方法中获取它的内容。然而,最近我还需要返回一个布尔值,所以我将我一直使用的相同代码放在“异步任务”方法中,以便检查结果。但是,当我这样做时,“DownloadAsync”方法永远不会完成(永远运行)。如果我采用相同的方法并将其放入“async void”方法中(不返回结果),“DownloadAsync”方法就可以完成。我不确定为什么这会有所不同,但确实如此。

在第一个方法中,设置“keysToCheck”字符串,设置布尔值,然后方法结束。

private async void SetStringAndBoolean(string text)
    {
        var keysToCheck= "";
        bool booleanToCheck;

        using (var dbx = new DropboxClient("TOKEN"))
        {
            using (var response = await dbx.Files.DownloadAsync("/FileToDownload.txt"))
            {
                keysToCheck = await response.GetContentAsStringAsync();
            }
        }

        var keys = keysToCheck.Split(new[] { Environment.NewLine }, StringSplitOptions.None).ToList();

        foreach (var key in keys)
            if (key == text)
                booleanToCheck = true;

        booleanToCheck = false;
    }

但是,在以下方法中,“DownloadAsync”方法永远不会完成。它只是永远运行。任何想法我做错了什么?

private async Task<bool> SetStringAndReturnBoolean(string text)
    {
        var keysToCheck = "";

        using (var dbx = new DropboxClient("TOKEN"))
        {
            using (var response = await dbx.Files.DownloadAsync("/FileToDownload.txt"))
            {
                keysToCheck = await response.GetContentAsStringAsync();
            }
        }

        var keys = keysToCheck.Split(new[] { Environment.NewLine }, StringSplitOptions.None).ToList();

        foreach (var key in keys)
            if (key == text)
                return true;

        return false;
    }

调用方法(按钮点击事件):

private async void Button_Click(object sender, RoutedEventArgs e)
    {
        if (!SetStringAndReturnBoolean(GuiTextBox.Text).Result)
            ErrorRun.Text = "Invalid Key";
        else
        {
            DialogResult = true;
            Close();
        }
    }

标签: c#wpfdropbox-api

解决方案


用于await调用方法而不是访问Result返回的Task.

private async void Button_Click(object sender, RoutedEventArgs e)
{
    bool result = await SetStringAndReturnBoolean(GuiTextBox.Text);
    if (!result)
    {
        ErrorRun.Text = "Invalid Key";
    }
    else
    {
        DialogResult = true;
        Close();
    }
}

Async仅当您始终使用它时才有效。除非您非常清楚自己的工作,否则切勿混用awaitTask.Result或。Task.Wait()


推荐阅读