при сохранении изображений в изолированном хранилище создается недопустимый межпотоковый доступ.

1

Я работаю в Windows Phone 8. Я пытаюсь сохранить несколько изображений в изолированном хранилище. Но во время сохранения, как мой пользовательский интерфейс, повесили. Возможно, это происходит для " Deployment.Current.Dispatcher.BeginInvoke ". Если я не использую Deployment.Current.Dispatcher.BeginInvoke, тогда я получаю недопустимую ошибку сквозного потока в строке " var bi = new BitmapImage(); ".

Пример кода для сохранения изображений:

Deployment.Current.Dispatcher.BeginInvoke(() =>
{
    var workingDictionary = new Dictionary<string, Stream>(streamDictionary);
    foreach (var item in workingDictionary)
    {
       var isoStore = IsolatedStorageFile.GetUserStoreForApplication();

       if (isoStore.FileExists(item.Key))
       isoStore.DeleteFile(item.Key);

       using (var writer = new StreamWriter(new IsolatedStorageFileStream(item.Key, FileMode.Create, FileAccess.Write, isoStore)))
       {
          var encoder = new PngEncoder();
          var bi = new BitmapImage();
          bi.SetSource(item.Value);
          var wb = new WriteableBitmap(bi);
          encoder.Encode(wb.ToImage(), writer.BaseStream);

          System.Diagnostics.Debug.WriteLine("saving..." + item.Key);
       }
    }
});

Любая помощь будет высоко оценена.

  • 0
    Edit не работает для вас?
  • 0
    Нет, это не сработало. :(
Показать ещё 1 комментарий
Теги:
xaml
image
isolatedstorage
windows-phone-8

3 ответа

1

Ваш пользовательский интерфейс определенно заморозит причину этого.

Deployment.Current.Dispatcher.BeginInvoke(() =>
{
// This code run on UI thread..
}

Этот код в основном запускает код внутри него на UI thead.

Просто поместите внутренний код в какой-нибудь другой async Task, что-то вроде этого..

private async Task RunInBackgroud()
{
   await Task.Run(()=>{}); // This is because any async Task does not went to background until
  // it encounter first await. this is just to make the thread in backgound as fast as possible.

   // your code for saving files..
  ..
  ..
}

и вызов выше, как простой вызов метода. Надеюсь, это поможет вам.

EDIT: - Почему бы просто не поместить это растровое изображение в код Диспетчера.

как..

BitmapImage bi;
    Dispatcher.BeginInvoke(() => {        
    bi = new BitmapImage();
});

EDIT 2: - Вот несколько ссылок на аналогичную проблему.

Создание BitmapImage в фоновом потоке WP7

Недопустимый сквозной доступ

Недопустимая проблема с доступом к нескольким потокам

  • 0
    Мне пришлось использовать Deployment.Current.Dispatcher.BeginInvoke . В противном случае я получаю недопустимый доступ к нескольким потокам .
  • 0
    Затем изучите причину «Неверный доступ к нескольким потокам» :) Поскольку сохранять изображения в потоке пользовательского интерфейса не очень хорошо, это поможет вам в будущем.
Показать ещё 4 комментария
0

Вы не можете напрямую обращаться к потоку пользовательского интерфейса из любого другого потока. Итак, вставьте свой код доступа к пользовательскому интерфейсу в Dispatcher.BeginInvoke()

Dispatcher.BeginInvoke(() =>
    {
        foreach (Button i in bts)
           i.Content = "";
    });

Или, пожалуйста, перейдите по этой ссылке:

http://www.codeproject.com/Articles/368983/Invoking-through-the-Dispatcher-on-Windows-Phone-a

0

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

Может быть, это то же самое для Windows Phone?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню