2013-02-15 3 views
3

Приложение для хранения окон, которое имеет длинный метод, который мне нужно вызвать, когда приложение запускается, но мне не нужно ждать его завершения. Я хочу, чтобы он выполнялся как фоновая задача. Если переход в определенную часть приложения (отчетность), то я проверю и при необходимости ждут задачи.Запустить задачу Async без использования Await в вызываемом методе

Это называется, как этот

Dim updateTask As Task(Of Boolean) = UpdateVehicleSummaries(0) 

Это не имеет никакого вызова AWAIT в нем, и я получаю предупреждение, что он будет работать синхронно. Как мне начать что-то подобное и запустить его асинхронно? Я хочу, чтобы он запускался по своему потоку/задаче, не блокируя поток интерфейса. Есть идеи?

Thanx!

+0

Простейшая реализация с помощью 'BackgroundWorker' –

+0

Есть какие-либо образцы? System.ComponentModel.BackgroundWorker не входит в структуру Windows.Store. –

+0

Нет, которые достаточно коротки, чтобы поставить здесь - я постараюсь составить короткий ответ ниже –

ответ

10

Вы должны запустить код в вашей функции внутри Task которой вы можете вернуться из него:

Public Shared Function UpdateVehicleSummaries(p_vehicleID As Int32) As Task(Of Boolean) 

    Return Task.Factory.StartNew(Of Boolean)(
     Function() 
      Dim tempVehicle As Koolsoft.MARS.BusinessObjects.Vehicle 

      For Each tempVehicle In Vehicles 
       If p_vehicleID = 0 Or p_vehicleID = tempVehicle.VehicleID Then 
        UpdateVehicleStats(tempVehicle) 
       End If 
      Next 

      Return True 
     End Function) 

End Function 

Вы можете позвонить в вашу функцию, как Вы предложили:

Dim updateTask As Task(Of Boolean) = UpdateVehicleSummaries(0) 

Позже вы может ждать завершения задачи, когда вам необходимо:

Dim result = Await updateTask 
+2

Я был неправ. Это намного проще, чем «BackgroundWorker»! –

+1

Отлично, но я бы предпочел вместо «If Not updateTask.IsComplete» это должен быть «Dim result = Await updateTask». Если он уже завершен, он должен немедленно вернуть результат, а если нет, он будет ждать завершения. –

+0

@RobertBeaubien Да, вы правы. Я соответствующим образом обновлю ответ. –

2

Я думаю, что это еще более простое решение, которое намного легче читать

Public Shared RunningTask As Task 

Public Shared Sub CallingSub() 
    'No need for sub to be async but can be async if needed for other reasons (see below) 
    'but that doesn't stop the execution in the CallingSub 
    'Get the task started... it's not going to wait for the task to be done just sets the task variable 
    RunningTask = UpdateVehicleSummaries(0) 

    'if a parameter comes from a function it may look like this 
    'note that if you do this then the CallingSub would need the async keyword 
    RunningTask = UpdateVehicleSummaries(Await FunctionReturnInt32()) 

    'Do stuff that does not require task to be done 


End Sub 
Public Shared Async Sub UseTaskResults() 
    'Must be async so you can await the result 
    Await RunningTask 
    'Do stuff that requires task to be done 
End Sub 

Public Shared Function UpdateVehicleSummaries(p_vehicleID As Int32) As Task 
    'No need for this function to be async since the function has no await 
    Dim tempVehicle As Koolsoft.MARS.BusinessObjects.Vehicle 

    For Each tempVehicle In Vehicles 
     If p_vehicleID = 0 Or p_vehicleID = tempVehicle.VehicleID Then 
      UpdateVehicleStats(tempVehicle) 
     End If 
    Next 
End Function 
Смежные вопросы