2014-10-15 2 views
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

остоит не работает для вас? – loop

+0

Нет, это не сработало. :( – raisul

+0

Он должен работать для вас, проверьте ссылку, которую я добавил в свой ответ. – loop

ответ

0

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

Возможно, это то же самое для Windows Phone?

1

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

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

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

Просто поместите внутри кода в какой-то другой асинхронной задачи что-то подобное ..

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: - Вот некоторые ссылки для аналогичной задачи ..

Creating BitmapImage on background thread WP7

Invalid cross-thread access

Invalid cross-thread access issue

+0

Мне пришлось использовать ** Deployment.Current.Dispatcher.BeginInvoke **. В противном случае я получаю ** Недопустимый доступ к перекрестным потокам ** , – raisul

+0

Затем исследуйте причину «Недопустимый доступ к перекрестным потокам» :) Потому что нехорошо сохранять изображения в потоке пользовательского интерфейса, это поможет вам в будущем. – loop

+0

@raisul Можете ли вы просто удалить «System.Diagnostics.Debug.WriteLine (« сохранение ... »+ item.Key); эта строка, когда вы не используете Dispatcher .. – loop

0

Вы не можете напрямую обращаться к потоку пользовательского интерфейса из любой другой темы. Таким образом, Encose код доступа UI в 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

Смежные вопросы