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)
                {
                }
            });
    }

很明显,我对如何做到这一点感到非常迷茫,我只是像我一样继续编码,是否可以使用 async/await 模式来实现这种行为?如何?

4

1 回答 1

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)
    {
    }
  });
}
于 2013-05-17T16:56:34.393 回答