2013-05-19 2 views
2

Когда я пытаюсь выполнить приведенный ниже код, выполните синхронные операции. Почему?Async с ожиданием не работает. Зачем?

Я получаю следующее предупреждение ...

Предупреждение 1 Этот метод асинхронной не хватает «ждать» операторов и будет работать синхронно. Подумайте, используя оператор «ожидание», чтобы ждать неблокирующих вызовов API или «ждать Task.Run (...)», чтобы выполнять работу с привязкой к процессору в фоновом потоке.

private async void btProcessa_Click(object sender, EventArgs e) 
{ 
    await ProcessaA(); 
    await ProcessaB(); 
} 

public async Task ProcessaA() 
{ 
    for (int i = 0; i <= 100; i++) 
    { 
     pbProcessoA.Value = i; 
     Thread.Sleep(500); 
    } 
} 

public async Task ProcessaB() 
{ 
    for (int i = 0; i <= 100; i++) 
    { 
     pbProcessoB.Value = i; 
     Thread.Sleep(500); 
    } 
} 
+1

Какая часть подробного сообщения вы не понимаете? Мы должны знать, чтобы ответить конкретно. – usr

+0

Этот вопрос выглядит как обман для [использования async без ожидания] (http://stackoverflow.com/questions/12016567/using-async-without-await) –

ответ

10

async не означает «запустить этот код на фоне потока». Если вы хотите узнать больше о async, у меня есть introductory blog post, MSDN docs отличные, и есть full guide to the Task-based Asynchronous Pattern.

Если вы хотите сделать некоторые моделирования I/O переплета (или на основе событий) операции, вы должны использовать Task.Delay вместо Thread.Sleep:

public async Task ProcessaA() 
{ 
    for (int i = 0; i <= 100; i++) 
    { 
    pbProcessoA.Value = i; 
    await Task.Delay(500); 
    } 
} 

Если вы хотите, чтобы имитировать работу центрального процессора переплета, то вы должны быть толкая их к фоновой задаче с помощью Task.Run:

public async Task ProcessaA() 
{ 
    for (int i = 0; i <= 100; i++) 
    { 
    pbProcessoA.Value = i; 
    await Task.Run(() => { Thread.Sleep(500); }); 
    } 
} 
+0

MSDN [FAQ по асинхронной/ожидан.] (Http: // blogs. msdn.com/b/pfxteam/archive/2012/04/12/async-await-faq.aspx) также необходимо прочитать. –

2

Я написал этот пример реальной производственной системы. Сохранение сущностей в базе данных может занять некоторое время. Посмотрите на это элегантное моделирование

class TestAsyncAwait 
{ 
    public void GetEntities() 
    { 
     for (int i = 0; i < 4; i++) 
     { 
      var a = getEntities(i); 
      saveEntitiesAsync(a); 
     } 
     Console.WriteLine("\nPress any key to close\n"); 
     Console.ReadKey(); 
    } 

    private List<string> getEntities(int i) 
    { 
     Console.Write("getting Entities for id={0}...", i); 
     Thread.Sleep(2000); 
     var r = new List<string> { i.ToString(), " Hello!" }; 
     Console.WriteLine("done, has the Entities for id={0}\n", i); 
     return r; 
    } 

    async void saveEntitiesAsync(List<string> a) 
    { 
     var sb = new StringBuilder(); 
     await Task.Run(() => 
     { 
      Thread.Sleep(4000); // simulates long task 
      foreach (string s in a) sb.Append(s); 
     }); 
     // shows the thread in action 
     Trace.WriteLine("saved: " + sb.ToString()); 
    } 
}