2013-05-19 49 views
2

当我尝试运行下面的代码时,执行同步操作。 为什么?异步与等待不起作用。为什么?

我得到以下警告...

警告1此异步方法缺乏“等待”运营商和将同步运行。考虑使用'await'操作符来等待非阻塞API调用,或者'等待Task.Run(...)'在后台线程上执行CPU绑定工作。

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

这个问题看起来像一个傻瓜来[使用异步无的await(http://stackoverflow.com/questions/12016567/using-async-without-await) –

回答

10

async并不意味着“运行在后台线程的代码”。如果你想知道更多关于async,我有一个introductory blog postMSDN 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); 
    } 
} 

如果你想模拟CPU绑定操作,那么你应该通过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://博客。 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()); 
    } 
}