Я работаю в 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);
}
}
});
Любая помощь будет высоко оценена.
Ваш пользовательский интерфейс определенно заморозит причину этого.
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: - Вот несколько ссылок на аналогичную проблему.
Вы не можете напрямую обращаться к потоку пользовательского интерфейса из любого другого потока. Итак, вставьте свой код доступа к пользовательскому интерфейсу в 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
Я не знаком с программированием на телефоне Windows, но это звучит как проблема с потоками. В Windows оба действия будут выполняться в одном потоке. Вот почему пользовательский интерфейс не может быть обновлен одновременно, но только после действия сохранения.
Может быть, это то же самое для Windows Phone?