Bonjour,
Je développe actuellement une application qui fait appel à des tâches asynchrones et des tâches de fond.
Dans mon application, je souhaite afficher des photos les unes après les autres.
Au niveau du chargement et de l'affichage, les étapes sont les suivantes :
- Affichage d'un message de chargement
- Téléchargement et mise en "cache" de 5 photos
- Suppression du message de chargement
- Affichage de la première photo
- Demande d'affichage de la seconde photo
- Téléchargement et mise en "cache" en arrière plan d'une 6ème photo
- Affichage de la deuxième photo
Les étapes 4 à 7 se répètent alors jusqu'à épuisement des photos.
Pour les étapes 1 à 3, je n'ai aucun soucis. J'utilise les mots clefs async/await pour attendre la fin de mon téléchargement asynchrone.
J'ai cependant un problème avec l'étape 6. En effet, dans cette étape, je ne souhaite pas attendre la fin de mon téléchargement. Cette étape se fait en arrière plan. Je me suis donc tourné vers un BackgroundWorker.
Le problème est qu'au moment de lancer mon BackgroundWorker, j'ai une erreur. Voici le Message et le StackTrace :
Voici quelques extraits de code.Une exception de première chance de type 'System.UnauthorizedAccessException' s'est produite dans System.Windows.ni.dll
Une exception de type 'System.UnauthorizedAccessException' s'est produite dans System.Windows.ni.dll et n'a pas été traitée avant une limite managée/native
at MS.Internal.XcpImports.CheckThread()
at System.Windows.DependencyObject..ctor(UInt32 nativeTypeIndex, IntPtr constructDO)
at System.Windows.Media.Imaging.BitmapImage..ctor()
at myService.<GetAsyncRequestImage>d__5.MoveNext()
Invalid cross-thread access.
La méthode DoWork de mon BackgroundWorker :
La méthode SelectAndDownloadAnEvent de mon objet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 private void _bgw_DoWork(object sender, DoWorkEventArgs e) { _myObject.SelectAndDownloadAnEvent(); }
Et finalement, la méthode qui pose problème GetAsyncRequestImage :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public async Task SelectAndDownloadEvents() { return myService.GetAsyncRequestImage(uri); }
Bien évidemment il ne s'agit que d'extraits de code. Par conséquent, certains mots clefs comme async ne sont pas exploités dans ce cas mais peuvent l'être dans d'autres. J'ai donc laissé les signatures de mes fonctions en l'état.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 public static BitmapImage GetAsyncRequestImage(Uri uri) { try { var image = new BitmapImage(); Deployment.Current.Dispatcher.BeginInvoke(() => { var request = (HttpWebRequest) WebRequest.Create(uri); request.BeginGetResponse(result => { using (var sr = request.EndGetResponse(result)) { image.SetSource(sr.GetResponseStream()); } }, null); }); return image; } catch (Exception) { return null; } }
Je ne comprends pas trop l'origine du problème. En effet, comme lu un peu partout sur internet, j'ai ajouté l'encapsulation dans le dispatcher qui dans la théorie mon problème mais sans succès.
J'ai également tenté d'encapsuler le contenu de ma méthode dans un lock, mais une fois de plus sans succès.
Merci d'avance pour votre aide !
Partager