c# - 为什么 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();
}
}
解决方案
用于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
仅当您始终使用它时才有效。除非您非常清楚自己的工作,否则切勿混用await
和Task.Result
或。Task.Wait()
推荐阅读
- python - Django some css not working in production
- kotlin - Android应用程序在按下按钮时崩溃,Kotlin
- html - laravel png 403(禁止)
- google-apps-script - 从 gSite 中检索链接?
- ios - 在开发环境中测试 Apple Schoolwork 时似乎无法访问 ClassKit 目录
- php - 具有灯塔验证器类的多个唯一列
- raspberry-pi - 如何 apt-get 安装 libncurses5-dev
- intellij-idea - 如何使用 intellij 调试器打印日志?
- node.js - 跨测试用例共享编译的模块参考
- reactjs - 为什么 TypeScript 不希望我将 className 属性分配给上下文提供程序?