0

私は最近VS2012をインストールしました。新しいasync修飾子と、それを非同期プログラミングに使用する方法について読んでいます。

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

ここでそれを行う方法についてかなり迷っていることは明らかです。私がマルチであるかのようにコーディングを続けているだけですが、非同期/待機パターンでこの動作を実装することは可能ですか? どのように?

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 に答える