2015-03-18 2 views
3

Я знаком с основными задачами, asyn/await и т. Д., Но я не сделал много продвинутых вещей, и я немного застрял в проблеме. У меня есть метод, который связывает систему с камерой. Код камеры работает в своем потоке, используя Task.Запустить задачу, что-то сделать, а потом подождать?

public Task<bool> DoCameraWork() 
    { 
     bool Result = true; 

     return Task.Run<bool>(() => 
     { 
      for (int i = 0; i < 10; i++) 
      { 
       // Do something which will set Result to True or False 

       if (Result) 
        break; 
       else 
        Task.Delay(1000); 
      } 

      return Result; 
     }); 
    } 

То, что я хочу быть в состоянии сделать, это запустить задачу (DoCameraWork), обновление пользовательского интерфейса, вызвать другой метод, а затем ждать, пока задача закончить, прежде чем продолжить.

Каков наилучший способ достичь этого? Вот макет, который, я надеюсь, объясняет немного больше. Да, код плохой, но он просто объясняет, чего я хочу достичь.

// Running on UI Thread 
public async void SomeMethod() 
{ 
    DoCameraWork(); // If I do await DoCameraWork() then rest of code won't process untill this has completed 

    TextBox.Text = "Waiting For camera work"; 
    SendData(); // Calls a method to send data to device on RS232, notthing special in this method 

    // Now I want to wait for the DoCameraWork Task to finish 

    // Once camera work done, check result, update UI and continue with other stuff  

    // if result is true 
    // TextBox.Text = "Camera work finished OK"; 
    // else if result is false 
    // TextBox.Text = "Camera work finished OK"; 
    // Camera work finished, now do some more stuff 
} 
+0

Для какой платформы Вы разрабатываете? –

ответ

5

Похоже, вы просто хотите, чтобы ждать в конце метода:

public async void SomeMethod() 
{ 
    var cameraTask = DoCameraWork(); 

    TextBox.Text = "Waiting For camera work"; 
    SendData(); 

    var result = await cameraTask; 
    TextBox.Text = result ? "Camera work finished OK" 
         : "Eek, something is broken"; 
    ... 
} 
+0

Да, я вроде хочу подождать позже, но я хочу, чтобы задача началась раньше. Поэтому задача должна начинаться до «SendData()», но я жду ее после, если это можно сделать. – Gaz83

+1

@ Gaz83 Вот что это делает. – Servy

+0

@Servy oh, поэтому var cameraTask = DoCameraWork() запускает задачу для запуска, а затем var result = await cameraTask; проверяет результат выполнения задачи, и если он не завершен, то он ждет там? – Gaz83

Смежные вопросы