【问题标题】:Visual studio errors/suggestions about async syntax [duplicate]关于异步语法的 Visual Studio 错误/建议 [重复]
【发布时间】:2016-07-02 22:08:14
【问题描述】:

我有一个方法,我声明为 asych 方法。代码如下所示。

private async Task<string> tempPassword()
{
    char[] hashes = "ABCDEFGHJKMNPQRUVWXY34689!?@$#".ToCharArray();
    Random r = new Random(DateTime.Now.Millisecond);
    List<char> bits = new List<char>();
    while (bits.Count < 7)
    {
         int i = r.Next(0, hashes.Length);
         if (!bits.Contains(hashes[i]))
              bits.Add(hashes[i]);
    }
    return string.Join("", bits.ToArray());
}

虽然这段代码是正确的并且可以编译,但 Visual Studio 给了我以下反馈:

此异步方法缺少等待操作符,将同步运行。 考虑使用 await 运算符来等待非阻塞 API 调用,或者 'await Task.Run(...)' 在后台线程上执行 CPU-Bound 工作。

虽然我没有丰富的异步背景知识(这就是我使用它的原因,老实说,所以我会学习)但在我看来,这种方法中没有任何需要await 运算符,所以我对我应该等待的内容有点困惑。

【问题讨论】:

  • 您的代码中没有任何异步内容,因此不应将其标记为异步。这就是编译器试图告诉你的。只需将签名更改为private string tempPassword()

标签: c# c#-4.0 asynchronous visual-studio-2015


【解决方案1】:

在我看来,这种方法中没有任何需要等待操作符的东西

那么,为什么首先要使用async 方法呢?如果你使用await,你只需要async。在其当前状态下,该方法将同步执行,并返回一个已经完成的Task&lt;string&gt;。如果您不希望它永远需要异步,您可以将其签名更改为仅返回 string。如果您确实希望它在将来变得异步(或者如果您无法更改返回类型,因为您正在实现接口或覆盖基类中的方法),您可以删除 async 修饰符,并显式返回一个已完成的任务:

return Task.FromResult(string.Join("", bits.ToArray()));

这将避免创建异步状态机的开销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多