Lar*_*ara 0 .net c# asynchronous async-await
我必须使用一个方法作为async和返回Task<bool>.但是在await我得到的关键字无法在编译时本身等待字符串作为错误.我试图从方法中返回bool但是徒劳.这是我的方法..
public async Task<bool> searchName(string Name)
{
Group retrievedGroup = new Group();
string foundGroup = null;
try
{
foundGroup = await Client().Groups
.Where(group => group.DisplayName.Equals(Name))
.ExecuteAsync().Result.ToString();
if (foundGroup == "Some Name")
{
return true;
}
else
{
return false;
}
}
catch (){ }
}
Run Code Online (Sandbox Code Playgroud)
问题只是运营商的优先事项.使用括号.你应该删除Result另外.
foundGroup = (await Client().Groups
.Where(group => group.DisplayName.Equals(Name))
.ExecuteAsync()).ToString();
Run Code Online (Sandbox Code Playgroud)
dot(.)具有比等待更高的优先级,所以当你有
foundGroup = await Client().Groups
.Where(group => group.DisplayName.Equals(Name))
.ExecuteAsync().Result.ToString();
Run Code Online (Sandbox Code Playgroud)
它会等待ToString();.还要注意你有
ExecuteAsync().Result.ToString();
Run Code Online (Sandbox Code Playgroud)
访问Result任务会导致它执行,并且会丢失您想要实现的所有异步条件.
不要Task.Result与 async-await 一起使用,因为它只会同步阻塞您的方法调用。相反,只需await:
public async Task<bool> SearchNameAsync(string Name)
{
Group retrievedGroup = new Group();
List<string> foundGroup = await Client().Groups
.Where(group => group.DisplayName.Equals(Name))
.ExecuteAsync();
return foundGroup.Contains("Some Name", StringComparer.OrdinalIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)
边注:
catch块,当您尝试调试代码并且不明白为什么此方法返回false而不是抛出时,它们会使您的生活更加困难。或者至少记录一些东西。string.Equals而不是==因为您可能想要提供一个StringComparison选项,例如,如果您想要进行不区分大小写的搜索。