2011-12-08 18 views
2

私は最近、CTP非同期ライブラリを発見しました。私は新しい概念に精通するためにおもちゃプログラムを作成しようとしましたが、問題にぶつかりつつあります。非同期プログラミング問題

私はコードが

Starting 
stuff in the middle 
task string 

を書き出す必要があると考えているが、そうではありません。ここに私が実行しているコードはあります:

namespace TestingAsync 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      AsyncTest a = new AsyncTest(); 
      a.MethodAsync(); 
     } 
    } 

    class AsyncTest 
    { 
     async public void MethodAsync() 
     { 
      Console.WriteLine("Starting"); 
      string test = await Slow(); 
      Console.WriteLine("stuff in the middle"); 
      Console.WriteLine(test); 
     } 

     private async Task<string> Slow() 
     { 
      await TaskEx.Delay(5000); 
      return "task string"; 
     } 
    } 
} 

アイデアはありますか?誰かが良いチュートリアルやそのコンセプトを示すビデオを知っていれば素晴らしいだろう。

答えて

5

あなたは非同期メソッドを呼び出していますが、アプリケーションを終了させるだけです。オプション:非同期ものは

  • あなたの非同期メソッドの戻りTaskを作成し、あなたのMainからその上で待機し、バックグラウンドスレッドで発生しているときに眠ることができるように

    • 、あなたのMain方法にThread.Sleep(またはConsole.ReadLine)を追加します。方法。たとえば、

    using System; 
    using System.Threading.Tasks; 
    
    class Program 
    { 
        static void Main(string[] args) 
        { 
         AsyncTest a = new AsyncTest(); 
         Task task = a.MethodAsync(); 
         Console.WriteLine("Waiting in Main thread"); 
         task.Wait(); 
        } 
    } 
    
    class AsyncTest 
    { 
        public async Task MethodAsync() 
        { 
         Console.WriteLine("Starting"); 
         string test = await Slow(); 
         Console.WriteLine("stuff in the middle"); 
         Console.WriteLine(test); 
        } 
    
        private async Task<string> Slow() 
        { 
         await TaskEx.Delay(5000); 
         return "task string"; 
        } 
    } 
    

    出力:

    Starting 
    Waiting in Main thread 
    stuff in the middle 
    task string 
    

    動画の点では、私は、プログレッシブ.NETで年に以前の非同期にセッションをしました - the video is online。さらに、私はEduasyncシリーズを含むblog posts about asyncの番号を持っています。

    また、マイクロソフトのチームのビデオやブログの投稿がたくさんあります。多くのリソースについては、Async Home Pageを参照してください。

  • +0

    2番目のオプションは、私が探していたものです。 'MethodAsync()'が 'Task'を返すと、' Main'から 'a.MethodAsync()。wait();'を呼び出すことができました。 – JesseBuesking

    1

    あなたは5000msが稼働する前にプログラムを終了しています。