如何编写简单的异步方法?

使用最新的CTP5和async / await关键字,我写了一些代码,显然无法编译:

class Program { public class MyClass { async public Task Test() { var result = await TaskEx.Run(() => { Thread.Sleep(3000); return 3; }); return result; } } static void Main(string[] args) { var myClass = new MyClass(); //The 'await' operator can only be used in a method or lambda marked with the 'async' modifier error ??!! int result = await myClass.Test(); Console.ReadLine(); } } 

“’await’运算符只能在标有”async“修饰符错误的方法或lambda中使用的原因是什么?” (我选择了Visual Studio指向的行)

我不知道你是否可以将Main标记为异步,但是你需要在任何使用await方法的声明中包含async关键字。 例如:

 public async void DoStuffAsync () { var myClass = new MyClass (); int result = await myClass.TestAsync (); } 

awaitWait() ; 做await是对该方法的重大改写,特别是影响该方法如何退出调用者的期望。 你是对的,因为它实际上没有太多(警告:返回类型),除了告诉编译器启用一些东西(如果你想到它就像unsafecheckedunchecked checked开关) – 但考虑:这实际上非常重要在你的例子中。 如果Main()退出(我们假设没有其他线程) – 你的exe 是吐司 。 不见了。 不复存在。 添加async使您认为仅仅因为退出方法并不意味着它已经完成 。 在准备好之前,你真的不希望Main()退出。

作为次要效果,此开关还规定该方法只能返回Task ; 如果没有交换机,您可能会想要稍后将其设置为异步,这可能是一个非常突破性的变化。

异步方法可以具有返回类型void或Task。 如果返回类型不是void,则调用者仍然可以使用Main条目方法(不能标记为异步)中的.Net 4中引入的标准Wait机制。 这是一个简单的例子:

  static void Main(string[] args) { string address = "http://api.worldbank.org/countries?format=json"; Task t = LoadJsonAsync(address); // do other work while loading t.Wait(); Console.WriteLine("Hit ENTER to exit..."); Console.ReadLine(); } private async static Task LoadJsonAsync(string address) { HttpClient client = new HttpClient(); HttpResponseMessage response = await client.GetAsync(address); // Check that response was successful or throw exception response.EnsureSuccessStatusCode(); // Read response asynchronously as JsonValue and write out top facts for each country JsonArray readTask = await response.Content.ReadAsAsync(); Console.WriteLine("First 50 countries listed by The World Bank..."); foreach (var country in readTask[1]) { Console.WriteLine(" {0}, Capital: {1}", country.Value["name"], country.Value["capitalCity"]); } }