Вызывающий поток не может получить доступ к этому объекту даже после добавления Dispatcher.Invoke - PullRequest
0 голосов
/ 31 марта 2020

Вызывающий поток не может получить доступ к этому объекту, поскольку другой поток владеет им даже после добавления Dispatcher.Invoke.

Проблема остается неизменной даже после добавления Dispatcher.Invoke.

async Task capturePredict()
{
    await Dispatcher.Invoke( async () =>
    {
        PngBitmapEncoder image = new PngBitmapEncoder();
        image.Frames.Add(BitmapFrame.Create(bitmap));

        using (Stream stream = File.Create(@"E:\ImageClassificationTraining\image.png"))
        {
            await Task.Run(() => image.Save(stream));
        }
    });
}

1 Ответ

1 голос
/ 31 марта 2020

В отличие от декодирования BitmapSource (который может быть заморожен, чтобы сделать его доступным для нескольких потоков), кодирование, по-видимому, не может выполняться в потоке, отличном от потока пользовательского интерфейса.

Однако вы можете отделить кодировку шаг от записи файла, примерно так:

public async Task SaveImageAsync(BitmapSource bitmap, string path)
{
    var encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bitmap));

    using (var memoryStream = new MemoryStream())
    {
        encoder.Save(memoryStream);
        memoryStream.Position = 0;

        using (var fileStream = File.Create(path))
        {
            await memoryStream.CopyToAsync(fileStream);
        }
    }
}
...