Возвращаемая строка из асинхронного метода - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь вернуть строку из асинхронного метода. Код приведен ниже.

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 »».

1 Ответ

0 голосов
/ 06 января 2019

Подсказка в определении метода. Вам нужно вернуть Task<string>, но вы пытаетесь вернуть StringBuilder.

Вам нужно сделать пару вещей, чтобы заставить это работать:

  1. Преобразовать StringBuilder в строку. Это просто сделать, вызвав ToString() на вашем result объекте, например

    result.ToString();

  2. Оберните строку, которую вы пытаетесь вернуть, в Task. В вашем случае, самый простой способ сделать это - позвонить по номеру Task.FromResult например,

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

Обратите внимание, хотя это позволяет вам await методы, которые вы кодируете, действительно асинхронные, поскольку они не привязаны к вводу / выводу. Посмотрите на этот ответ о том, как и зачем использовать async/await.

...