【问题标题】:Return string from an asynchronus method从异步方法返回字符串
【发布时间】:2019-01-06 04:33:13
【问题描述】:

我正在尝试从异步方法返回一个字符串。代码如下。

public async Task<String> AuthenticateUser(string UserID, string Password)
    {
        String securityToken = String.Empty;

        if (UserID == "qw" && Password == "sa")
        {
            securityToken = await GetUniqueKey();
        }
        return securityToken;
    }

    private async Task<string> GetUniqueKey()
    {
        int maxSize = 8;
        int minSize = 5;
        char[] chars = new char[62];
        string a;
        a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW XYZ1234567890";
        chars = a.ToCharArray();
        int size = maxSize;
        byte[] data = new byte[1];
        RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
        crypto.GetNonZeroBytes(data);
        size = maxSize;
        data = new byte[size];
        crypto.GetNonZeroBytes(data);
        StringBuilder result = new StringBuilder(size);
        foreach (byte b in data)
        { result.Append(chars[b % (chars.Length - 1)]); }

        string r = await result;
        return r;
    }

我面临的错误是“StringBuilder 不包含 'Getawaiter' 的定义”。

【问题讨论】:

    标签: .net-core async-await


    【解决方案1】:

    线索在方法定义中。您需要返回Task&lt;string&gt;,但您正在尝试返回StringBuilder

    你需要做几件事才能让它工作:

    1. 将 StringBuilder 转换为字符串。这很简单,只需在 result 对象上调用 ToString() 即可,例如

      result.ToString();

    2. 将您尝试返回的字符串包装在Task 中。在您的情况下,最简单的方法是致电Task.FromResult,例如

      return Task.FromResult(result.ToString());

    请注意,尽管这允许您await 您编写的方法实际上是异步的,因为它不受 I/O 限制。看看this answer,了解如何以及为什么使用async/await

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      相关资源
      最近更新 更多