2013-02-26 7 views
1

Comment attendre une tâche d'une méthode asynchrone, dans une méthode non asynchrone, sans appeler la méthode?Comment appeler la méthode asynchrone de manière asynchrone à partir d'une méthode non asynchrone

Class TestAsync 
    Dim workevent As New Threading.ManualResetEvent(False) 
    Sub work() 
     Dim Task As Task = Test() 
     'Do Work which affects Test Here 
     Threading.Thread.Sleep(100) 
     workevent.Set() 
     'wait for Test to complete 
     'Task.Wait() -causes the application to hang 
    End Sub 

    Async Function Test() As Task 
     workevent.WaitOne() 
    End Function 
End Class 

Répondre

2

D'abord, si possible, ne faites jamais cela. Attendre de manière synchrone une méthode asynchrone supprime tout le but de l'utilisation d'async. Au lieu de cela, vous devriez faire work() dans un Async Function WorkAsync() As Task. Et puis faites la méthode (s) qui appellent work() asynchrone aussi, et ainsi de suite, tout le chemin vers le haut.

Deuxièmement, asynchrone n'est pas identique au parallèle. Si vous avez Async méthode sans Await s, il sera exécuté de manière complètement synchrone, comme si c'était une méthode normale. Ainsi, votre méthode va se bloquer même sans Task.Wait().

Ce que vous pouvez faire est de courir Test() sur un thread d'arrière-plan à l'aide Task.Run():

Sub work() 
    Dim Task As Task = Task.Run(AddressOf Test) 
    Threading.Thread.Sleep(100) 
    workevent.Set() 
    Task.Wait() 
End Sub 

Le Task retourné de Run() terminera lorsque le Task retourné de Test() finalise.

(Il y a d'autres problèmes qui causent se bloque lors de la combinaison Wait() et Async, mais ils ne sont pas pertinents dans ce cas précis.)

Mais je le répète: vous ne devriez pas faire cela, car il bloque le thread d'interface utilisateur, mais ce n'est que pour un court moment.

+0

Cette fonction est exécutée dans un test unitaire, elle doit donc cesser d'être asynchrone quelque part – user1937198

+0

@ user1937198 Ce n'est pas le cas si votre infrastructure de test unitaire prend en charge 'Async'. Et les versions actuelles de la plupart des frameworks de tests unitaires pour .Net le font. – svick

+0

+1. Les versions actuelles de MSTest, xUnit et NUnit prennent toutes en charge les méthodes de test unitaires 'async' qui retournent' Task'. –

Questions connexes