Как предотвратить автоматическое удаление растрового изображения Android при создании в фоновом потоке из Task.Run() в СC#

Место общения программистов C#
Ответить
Anonymous
 Как предотвратить автоматическое удаление растрового изображения Android при создании в фоновом потоке из Task.Run() в С

Сообщение Anonymous »

Я загружаю «собственные растровые изображения» (Android Bitmap в Android) в класс-оболочку на C#:

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

public class NativeBitmap {
public Android.Graphics.Bitmap bitmap;
public int rawHeight = 0;
public int rawWidth = 0;
}
Я загружаю растровые изображения Android в этот класс-оболочку с диска, используя:

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

private async Task getNativeBitmapFromDisk(string localPhotoPathAndName) {

NativeBitmap nativeBitmap = new();

using (FileStream fs = File.Open(localPhotoPathAndName, FileMode.Open, FileAccess.Read, FileShare.Read)) {

nativeBitmap.bitmap = Android.Graphics.BitmapFactory.DecodeStream(fs);
nativeBitmap.rawWidth = nativeBitmap.bitmap.Width;
nativeBitmap.rawHeight = nativeBitmap.bitmap.Height;
}
return nativeBitmap;

}
Теперь я могу запустить это двумя способами: (1) в основном потоке или (2) в фоновом потоке. Фоновая обработка потоков быстрее и желательнее, но если я запущу это как:

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

//main thread method (works):
photoNativeBitmap[0] = await getNativeBitmapFromDisk(localPhotoPathAndName); //main threaded, works

//background thread method (DOES NOT RELIABLY WORK):
//photoNativeBitmap[0] = await Task.Run(() => getNativeBitmapFromDisk(localPhotoPathAndName));

try {
Debug.WriteLine("GOT ANDROID PHOTO, WIDTH: " + photoNativeBitmap[0].bitmap.Width);
}
catch (Exception e) {
Debug.WriteLine("EXCEPTION ON TASK RUN: " + e.Message);
}
Использование метода Task.Run фонового потока часто приводит к исключению, которое соответствует e.Message:

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

Cannot access a disposed object. Object name: 'Android.Graphics.Bitmap'
Поэтому, когда я использую этот метод через Task.Run, как описано выше, растровое изображение Android иногда удаляется операционной системой, прежде чем оно возвращается обратно в основной поток. .
Это ожидаемое поведение? Или, возможно, какая-то ошибка C#/.NET? Я хотел бы использовать загрузку через Task.Run, чтобы попытаться выполнить загрузку растрового изображения из основного потока, но не в том случае, если растровое изображение будет собираться мусором в процессе.
Спасибо за любые мысли и идеи.

Подробнее здесь: https://stackoverflow.com/questions/793 ... enerated-o
Ответить

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

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

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

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

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