为什么 Dropbox API 的 "DownloadAsync" 方法在异步任务 <bool> 方法中 运行 时冻结。 C#

Why does the Dropbox API's "DownloadAsync" method freeze when run in an async Task<bool> method. C#

因此,我在我的 C# 应用程序中使用 Dropbox API 来下载文件和检查字符串。以前,我一直使用“DownloadAsync”方法下载文件并在“async void”方法中获取文件内容。然而,最近我还需要 return 一个布尔值,所以我将我一直使用的相同代码放在“异步任务”方法中,以便我可以检查结果。但是,当我这样做时,“DownloadAsync”方法永远不会完成(永远运行)。如果我采用相同的方法并将其放入“async void”方法(没有 returning 结果),则“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();
        }
    }

使用 await 调用方法而不是访问返回的 TaskResult

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.ResultTask.Wait()