Можно ли дождаться вызова задачи? - PullRequest
0 голосов
/ 28 февраля 2019

Есть ли способ ожидания вызывающей задачи?

Async Function DoStuff() As Task
    StartDoingOtherStuff()

    ' Doing stuff
End Function

Async Function StartDoingOtherStuff() As Task
    ' Doing stuff

    Await callingTask

    ' Finish up
End Function

Примечание. Я хочу распараллелить задачу, поскольку она предполагает загрузку файла в несколько мест назначения.Но я хочу дождаться вызова, чтобы удалить файл после завершения всех загрузок.

1 Ответ

0 голосов
/ 01 марта 2019

На основании ответа пользователя на Получить текущий экземпляр задачи в теле асинхронного метода , вы можете сделать это:

Private Async Function DoStuff() As Task
    'Capture the resulting task in a variable.
    Dim t As Task = (
        Async Function() As Task
            Console.WriteLine("DoStuff()")

            'First await. Required in order to return the task to 't'.
            Await Task.Delay(1)

            'Disable warnings:
            '    "Because this call is not awaited (...)"
            '    "Variable 't' is used before it has been assigned a value (...)"

#Disable Warning BC42358, BC42104

            'Call other method.
            DoOtherStuff(t)

#Enable Warning BC42358, BC42104

            'Simulate process.
            Await Task.Delay(3000)
        End Function
    ).Invoke()

    'Await if needed.
    Await t
End Function

Private Async Function DoOtherStuff(ByVal ParentTask As Task) As Task
    Console.WriteLine("DoOtherStuff()")

    'Await parent task.
    Await ParentTask

    Console.WriteLine("DoStuff() finished!")
End Function

Используя лямбда-выражениеВы можете захватить текущее задание, а затем передать его себе.Await Task.Delay(1) требуется для того, чтобы асинхронный метод возвратил свою задачу, чтобы он мог быть установлен в переменную.Тем не менее, вы можете удалить его, если у вас уже есть ожидание до вызова DoOtherStuff().

...