Windows Phone 8.1 BitmapDecoder async/await не выполняет всю функцию

Это продолжение ответа на вопрос, который я ранее разместил здесь.

Я поместил предложенный ответ в асинхронную функцию:

public static async Task<int[]> bitmapToIntArray(Image bitmapImage)       
    {
        string fileName = "/Images/flowers.jpg";

        StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
        IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read);
        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);

        var pixelData = await decoder.GetPixelDataAsync();
        var pixels = pixelData.DetachPixelData();

        var width = decoder.OrientedPixelWidth;
        var height = decoder.OrientedPixelHeight;

        int[] colors = new int[width * height];


        for (var i = 0; i < height; i++)
        {
            for (var j = 0; j < width; j++)
            {
                byte r = pixels[(i * height + j) * 4 + 0]; //red
                byte g = pixels[(i * height + j) * 4 + 1]; //green
                byte b = pixels[(i * height + j) * 4 + 2]; //blue (rgba)

                colors[i * height + j] = r;
            }
        }

        return colors;
    }

Он вызывается из основной функции ниже:

public void ApplyImageFilter(Image userImage, int imageWidth, int imageHeight)
    {
        ...
        int[] src = PixelUtils.bitmapToIntArray(userImage).Result;
        ...
        ;
    }

Однако, когда я вхожу в строку выше, происходит то, что только вторая строка функции bitmapToIntArray:

StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);

ожидает завершения, а затем возвращается к ApplyImageFilter и выполняет оставшуюся часть этой функции (и выдает ошибку в конце). Он не переходит ни к одной строке после первого ожидания в функции bitmapToIntArray. Я сравнил async/await с предыдущим успешным проектом, и кажется, что оба раза я следовал одной и той же процедуре. Также прочитайте о функциональности async/await и немного поиграйте с кодом, но безуспешно. Я не знаю, что еще я могу попробовать, поэтому любые предложения будут очень признательны.


person greentea    schedule 14.03.2015    source источник
comment
похоже, что нижестоящий код полагается на результат PixelUtils.bitmapToIntArray(), но он еще не завершен, поэтому результата нет. Поэтому вам следует подождать, пока PixelUtils.bitmapToIntArray() вернется с результатом, прежде чем переходить к остальной части метода.   -  person erotavlas    schedule 15.03.2015


Ответы (1)


Вы блокируете поток пользовательского интерфейса, вызывая Result.

Если вы идете асинхронно, вы должны идти асинхронно до конца.

public async Task ApplyImageFilter(Image userImage, int imageWidth, int imageHeight)
{
    ...
    int[] src = await PixelUtils.bitmapToIntArray(userImage);
    ...
}

Для получения дополнительной информации о async-await прочитайте статьи, которые я курирую.

person Paulo Morgado    schedule 15.03.2015