添加并作为长异步列表返回

时间:2018-11-22 01:09:10

标签: c# c#-4.0

我尝试创建一个函数,该函数将创建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 :(得分:2)

if条件下,您的return语句放置在错误的位置。将声明移至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;

希望这会有所帮助!

答案 1 :(得分:1)

该函数未使用正确的返回类型定义。

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