为什么 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
调用方法而不是访问返回的 Task
的 Result
。
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()
。
因此,我在我的 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
调用方法而不是访问返回的 Task
的 Result
。
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()
。