Я сделал проект для изображений кеша. Я хочу подождать в основном потоке для полной функции DownloadImage, а затем вернуть это сохраненное растровое изображение. Это возможно? Я делаю это даже правильно?Windows Phone - Кэш изображения - дождитесь загрузки изображения
public static ImageSource GetImage(int id)
{
BitmapImage bitmap = new BitmapImage();
String fileName=string.Format("ImageCache/{0}.jpg", id);
using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
if (!myIsolatedStorage.DirectoryExists("ImageCache"))
{
myIsolatedStorage.CreateDirectory("ImageCache");
}
if (myIsolatedStorage.FileExists(fileName))
{
using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile(fileName, FileMode.Open, FileAccess.Read))
{
bitmap.SetSource(fileStream);
}
}
else
{
DownloadImage(id);
//HERE - how to wait for end of DownloadImage and then do that below??
using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile(fileName, FileMode.Open, FileAccess.Read))
{
bitmap.SetSource(fileStream);
}
}
}
return bitmap;
}
Вот функция DownloadImage:
private static void DownloadImage(Object id)
{
WebClient client = new WebClient();
client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
client.OpenReadAsync(new Uri(string.Format("http://example.com/{0}.jpg", id)), id);
}
private static void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
if (e.Error == null && !e.Cancelled)
{
try
{
string fileName = string.Format("ImageCache/{0}.jpg", e.UserState);
IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(fileName);
BitmapImage image = new BitmapImage();
image.SetSource(e.Result);
WriteableBitmap wb = new WriteableBitmap(image);
// Encode WriteableBitmap object to a JPEG stream.
Extensions.SaveJpeg(wb, fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
fileStream.Close();
}
catch (Exception ex)
{
//Exception handle appropriately for your app
}
}
}
}
Спасибо за ваш ответ. Когда я пытаюсь использовать async жду, я получаю ошибку преобразования задачи в ImageSource. Можете ли вы привести пример, как правильно это сделать? или лучше, если вы напишете что-то, как это сделать, используя события? –
bmit
Просто переместите с помощью (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile (fileName, FileMode.Open, FileAccess.Read)) { bitmap.SetSource (fileStream); } до конца client_OpenReadCompleted, и все в порядке. –
Но тогда я не смогу вернуть растровое изображение как возврат 'public static ImageSource GetImage (int id)' – bmit