Bonjour
Je souhaite tout mes voeux à toute la communauté !
que cette année soit remplie de code nous amenant à progresser !
Dans mon projet de traitement de mes fichiers médias, suites aux dernières modifications, j'ai préféré refaire au propre certaines parties.
De ce fait j'essai d'apporter quelque chose de plus "fluide" dans les phases qui peuvent être assez longues de traitement.
une fois que j'ai récupéré mes fichiers "médias", j'ai donc un traitement à effectuer sur chacun d'eux.
Pour chaque fichier, X extractions via MediaInfo (une information particulière à chaque fois, ce que j'ai regroupé sous le nom de template)
Je voudrais donc tenter d'optimiser au mieux le temps d'execution de tout ceci, ce qui peut s'avéré long. (déjà car il y a à chaque fois ouverture de fichier)
pour récupérer les données, j'instancie ma classe MediaInfo (MI)
puis j'ouvre le fichier,
Puis je peux faire des "Get" en passant certains paramètres
exemple classique :
Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Dim MI = New MediaLib.MediaInfo If MI.Open(f) Then dim res1 as string = MI.Get(StreamKind.Video, 0, "Format") dim res2 as string = MI.Get(StreamKind.Video, 0, "Width") dim res3 as string = MI.Get(StreamKind.Video, 0, "Height") end if MI.Close() MI = Nothing
Pour faire un peu plus propre et pour par la suite éviter de saisir à la main (exemple en lisant un XML),J'ai regroupé sous une structure les élements suivant :
- type
- NumPiste
- Champ
que j'ai nommé template et mis l'ensemble dans un list(of template)
Etape 1 - Récupération des données sur 1 fichier en asynchrone
Et donc je voudrais pendant que le fichier est ouvert, pouvoir profiter de faire cette récupération de manière asynchrone.
Pour ce faire, j'ai lu le très bon article :
http://www.e-naxos.com/Blog/post/De-la-bonne-utilisation-de-AsyncAwait-en-C.aspx
Mais je remarque qu'à chaque fois quand l'auteur défini sa méthode en async il a mis un await task.Delay justement pour simuler le temps de traitement.
Ce dont je n'ai pas besoin de mon côté à simuler.
Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Public Async Function Traitement(template As TmpTemplate) as task(of string) 'Nota : sinon retourner template avec String complété Console.WriteLine("Traitement") 'Await Task.Delay(100) Dim z = MI.Get(template.Type, template.NumPiste, template.Champ) Return z End Function
Etape 2 - Await Task.WhenAll
Toujours très bon tuto : http://www.e-naxos.com/Blog/post/Tas...-partie-9.aspx
dans lequel on évoque le task.WhenAll évoqué dans le tuto pour l'asynchronisme.
pouvoir traiter si possibles plusieurs fichiers et attendre chaque fin de traitement.
Code vb.net : 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 Dim lst As New List(Of TmpTemplate) From { New TmpTemplate(StreamKind.General, 0, "UniqueID"), New TmpTemplate(StreamKind.General, 0, "DureeStr3"), New TmpTemplate(StreamKind.General, 0, "FileSize"), New TmpTemplate(StreamKind.Video, 0, "Format"), New TmpTemplate(StreamKind.Video, 0, "Width"), New TmpTemplate(StreamKind.Video, 0, "Height"), New TmpTemplate(StreamKind.Video, 0, "FrameRate"), New TmpTemplate(StreamKind.Audio, 0, "Format"), New TmpTemplate(StreamKind.Audio, 0, "FormatInfo") } Dim MI = New MediaLib.MediaInfo If MI.Open(f) Then Dim res As String() = Await Task.WhenAll(lst.Select(Function(x) (a.Traitement(x)))) End If MI.Close() MI = Nothing
Je n'arrive donc pas à faire cohabiter mon task.WhenAll avec le async également je suppose à cause du await obligatoire dans la fonction de traitement, donc pas de retour de task(Of String) etc, tout est bloqué non compilable.
il doit donc y avoir quelque chose que je ne comprends pas, qui m'échappe... ou je m'y prends mal dans la logique de la chose. J'ai beau triturer des exemples sur le net, la plupart ont soit un await delay ou une fonction de type asynchrone dejà à l’intérieur comme "GetStringAsync" et donc on mets le await devant (que qui dans ma logique correspond finalement à mon await pour mon appel à traitement et non à l’intérieur de la fonction elle même...)
Je m'y perds... un peu d'aide ne serait pas de refus.
Merci.
Partager