我可以使用新的async/await方法与此代码

本文关键字:方法 await 代码 async 可以使 我可以 | 更新日期: 2023-09-27 18:14:03

我最近安装了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方法与此代码

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