从异步方法返回bool

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)

Ham*_*jam 6

问题只是运营商的优先事项.使用括号.你应该删除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任务会导致它执行,并且会丢失您想要实现的所有异步条件.


Yuv*_*kov 5

不要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)

边注:

  1. 在异步方法上使用“Async”后缀。
  2. 请遵循 .NET 命名约定,即方法的 PascalCase。
  3. 不要使用空catch块,当您尝试调试代码并且不明白为什么此方法返回false而不是抛出时,它们会使您的生活更加困难。或者至少记录一些东西。
  4. 我使用了string.Equals而不是==因为您可能想要提供一个StringComparison选项,例如,如果您想要进行不区分大小写的搜索。

  • 为什么你认为这个方法返回一个`string`? (2认同)