2013-05-17 41 views
0

我最近安装了VS2012,我正在阅读新的异步修改器以及如何将其用于异步编程。我可以使用此代码的新异步/等待方法

现在,我很容易使用像System.IO或Web服务调用中的内置框架函数,但我试图使用我自己的函数。我做了一个小的控制台应用程序,基本上异步任务是一个随机数,它将在循环中生成,直到它等于0,并且我想在平均时间内显示加载消息。下面是我做的代码:

private static void Main(string[] args) 
    { 
     var rnd = new Random(); 
     var factory = new TaskFactory(); 

     var task = GetRandomNumber(rnd); 
     while(!task.IsCompleted){ 
     System.Console.Write("Loading ."); 
     System.Console.Write("."); 
     System.Console.Write("./n"); 
     } 
    } 

    private static async Task GetRandomNumber(Random rnd) 
    { 
     await new Task(delegate 
      { 
       while (rnd.Next() != 0) 
       { 
       } 
      }); 
    } 

很明显,我几乎失去了怎么办,在这里我只是不停地编码它就像如果我是多,是有可能实现与异步此行为/等待模式?怎么样?

+0

我想这是一个学习的榜样 - 你可以给你想掌握该图案的更高度概括? –

+0

尽管这个问题的答案很精美,但我想在你的代码中指出问题 - 你创建了一个新的Task..',但从来没有启动过它。如果您在下面的答案中使用Task.Factory.StartNew或Task.Run,​​那么您不必明确地启动它。 – YK1

回答

1

async并不一定意味着“多线程”。您可以使用Task.Run旋转一个新的后台任务,您可以await

private static void Main(string[] args) 
{ 
    var rnd = new Random(); 
    var task = GetRandomNumber(rnd); 
    while(!task.IsCompleted){ 
    System.Console.Write("Loading ."); 
    System.Console.Write("."); 
    System.Console.Write("./n"); 
    } 
} 

private static Task GetRandomNumber(Random rnd) 
{ 
    return Task.Run(() => 
     { 
      while (rnd.Next() != 0) 
      { 
      } 
     }); 
} 

虽然我可能会做这样的:

private static void Main(string[] args) 
{ 
    MainAsync().Wait(); 
} 

private static async Task MainAsync() 
{ 
    var rnd = new Random(); 
    var randomTask = GetRandomNumber(rnd); 
    System.Console.Write("Loading ."); 
    while (await Task.WhenAny(randomTask, Task.Delay(500)) != randomTask) 
    { 
    System.Console.Write("."); 
    } 
    System.Console.WriteLine(); 
} 

private static Task GetRandomNumber(Random rnd) 
{ 
    return Task.Run(() => 
    { 
    while (rnd.Next() != 0) 
    { 
    } 
    }); 
}