WinUI3 BitmapEncoder.FlushAsync() зависаетC#

Место общения программистов C#
Ответить
Anonymous
 WinUI3 BitmapEncoder.FlushAsync() зависает

Сообщение Anonymous »

В моем приложении WinUI3 есть следующий код:

Код: Выделить всё

public class Screenshot(byte[] pixels, int width, int height)
{
public byte[] Pixels { get; } = pixels;
public int Width { get; } = width;
public int Height { get; } = height;
}

public static async Task ByteArrayToBase64PNGStringAsync(Screenshot screenshot)
{
using (InMemoryRandomAccessStream memoryStream = new())
{
await RenderPixelsToRasterStreamAsync(memoryStream, screenshot);

using (DataReader reader = new(memoryStream.GetInputStreamAt(0)))
{
await reader.LoadAsync((uint)memoryStream.Size);
byte[] byteArray = new byte[memoryStream.Size];
reader.ReadBytes(byteArray);

return Convert.ToBase64String(byteArray);
}
}
}

public static async Task CopyScreenshotToClipboardAsync(Screenshot screenshot)
{
InMemoryRandomAccessStream stream = new();
await RenderPixelsToRasterStreamAsync(stream, screenshot);

DataPackage dataPackage = new();
dataPackage.RequestedOperation = DataPackageOperation.Copy;
dataPackage.SetBitmap(RandomAccessStreamReference.CreateFromStream(stream));

try
{
Clipboard.SetContent(dataPackage);
return true;
}
catch (Exception)
{
return false;
}
finally
{
Debug.WriteLine("Clipboard flushed");
Clipboard.Flush();
stream.Dispose();
}
}

private static async Task RenderPixelsToRasterStreamAsync(IRandomAccessStream stream, Screenshot screenshot)
{
double dpi = App.Window.DPI;
Debug.WriteLine($"RenderPixelsToRasterStreamAsync method called with {(uint)screenshot.Width} {(uint)screenshot.Height} {dpi}");
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
Debug.WriteLine("Encoder initialised");
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied, (uint)screenshot.Width, (uint)screenshot.Height, dpi, dpi, screenshot.Pixels);
Debug.WriteLine("Bitmap set");
await encoder.FlushAsync();
Debug.WriteLine("Encoder flushed");
}
Я могу без проблем вызвать любую комбинацию/повторение ByteArrayToBase64PNGStringAsync и CopyScreenshotToClipboardAsync, за исключением случаев, когда я вызываю CopyScreenshotToClipboardAsync то ByteArrayToBase64PNGStringAsync, и в этом случае код зависает на неопределенный срок в ожидании кодировщик.FlushAsync(). (используя поток пользовательского интерфейса).
Может ли кто-нибудь подсказать, что может быть причиной этого?

Подробнее здесь: https://stackoverflow.com/questions/792 ... sync-hangs
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»