задачаметод предупреждает о неявном приведении без асинхронного - PullRequest
0 голосов
/ 22 февраля 2019

Я создал метод для сбора энтропии для моего приложения.
Я поместил это в Задачу, чтобы обеспечить асинхронную операцию для вызывающего.
Я хочу избежать вечного цикла при сборе энтропии издатчики, поэтому я использовал тайм-аут, который по умолчанию использует метод RNGCryptoServiceProvider.GetBytes().

public Task<byte[]> GetEntropy1(int length)
{
    RNGCryptoServiceProvider entropyGen = new RNGCryptoServiceProvider();
    byte[] entropyBuffer = new byte[2048];

    try
    {
        semaphore.Wait();

        Task t = Task.Run(() =>
        {
            /* gather entropy from sensors */
        });

        if (!t.Wait(5000))
        {
            entropyGen.GetBytes(entropyBuffer);
        }
        return entropyBuffer;
    }
    catch (Exception)
    {
        return entropyBuffer;
    }
    finally
    {
        this.semaphore.Release();
    }
}

Но я не понимаю, почему, когда я возвращаю байтовый массив, я получаю предупреждение о неявном приведении.
Невозможно неявно преобразовать тип 'byte []' в 'System.Threading.Tasks.Task'

Если я использую async в определении функции, то это предупреждение исчезнет.

1 Ответ

0 голосов
/ 22 февраля 2019

Поскольку async включает компилятор, переписывающий ваш метод, а одна из вещей, которые он делает , заключается в переносе возвращаемых значений в Task.Без этого переписывание не происходит, и, как говорится в сообщении об ошибке, byte[] не a Task<byte[]>.

Вы можете написать Task.FromResult() в каждом из ваших return пунктов 1 , чтобы выполнить собственную ручную упаковку.


1 Хотя после удаления неприятного предложения catch этопросто собираюсь скрыть ошибок от вас позже, у вас все равно будет только одна.

...