Добавить и вернуть как список длинных асинхронных - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь создать функцию, которая создаст массив long и вернет его, потому что я буду использовать внутри другой функции.

    private async Task<List<long>> ReturnListArrayLong()
    {
        if (MemOpen())
        {
            byte[] bPosition = new byte[290];
            mmfvs.Read(bPosition, 0, 290);
            Buffer.BlockCopy(bPosition, 0, data, 0, bPosition.Length);

            List<long> ArrayLong = new List<long>();
            for (int i = 0; i < data.Length; i++)
            {
                if (data[i] != 0)
                {
                    await Task.Run(() => ArrayLong.Add(data[i]));
                }
                await Task.Delay(10);
            }
            return ArrayLong;
        }
    }

public async Task getArray()
{
    await ReturnListArrayLong();
}

enter image description here Ошибка: DrawForm.ReturnListArrayLong () ': не все пути кода возвращают значение

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вы получили заявление о возврате в неправильном месте, в пределах условия if.Переместите декларацию и вернитесь за пределы if, и все будет хорошо.

List<long> ArrayLong = new List<long>();
if (MemOpen())
        {
            byte[] bPosition = new byte[290];
            mmfvs.Read(bPosition, 0, 290);
            Buffer.BlockCopy(bPosition, 0, data, 0, bPosition.Length);


            for (int i = 0; i < data.Length; i++)
            {
                if (data[i] != 0)
                {
                    await Task.Run(() => ArrayLong.Add(data[i]));
                }
                await Task.Delay(10);
            }

        }
return ArrayLong;

Надеюсь, это поможет!

0 голосов
/ 22 ноября 2018

Функция не определена с правильным типом возврата.

ArrayLong должно быть List<long>, в то время как в настоящее время оно определено как List<Task<long>>

dataбыть long[], поэтому вам нужно вызвать Add(data[i]) в списке, а не AddRange, что предполагает IEnumerable<long>

private async Task<List<long>> ReturnListArrayLong() {
    List<long> ArrayLong = new List<long>();
    if (MemOpen()) {
        byte[] bPosition = new byte[290];
        mmfvs.Read(bPosition, 0, 290);
        Buffer.BlockCopy(bPosition, 0, data, 0, bPosition.Length);            
        for (int i = 0; i < data.Length; i++) {
            if (data[i] != 0) {
                await Task.Run(() => ArrayLong.Add(data[i]));
            }
           await Task.Delay(10);
        }
    }
    return ArrayLong;
}

Также используйте Task.Delay вместо Thread.Sleep в асинхронной функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...