1

フレームワークを使用してWeb呼び出しを行っていますasync。以下のコードにエラーが記載されています

class Program
{
    static void Main(string[] args)
    {
        TestAsync async = new TestAsync();
        await async.Go();//Error:  the await operator can only be used with an async method.  Consider markign this method with the async modifier.  Consider applying the await operator to the result of the call
    }
}

class TestAsync
{
    public async Task Go()
    {
        using (WebClient client = new WebClient())
        {
            var myString =  await client.DownloadStringTaskAsync("http://msdn.microsoft.com");
            Console.WriteLine(myString);
        }    
    }
}

このコードのいくつかのバリエーションを試しました。実行時に失敗するか、コンパイルされません。この場合、非同期呼び出しの起動が許可される前にメソッドが完了します。私は何が間違っているのですか?

私の目標は、WebClientを非同期的に使用してWebサイトへの呼び出しを実行することです。結果を文字列として返し、を使用して出力したいと思いますConsole.WriteLine。実行するコードから始める方が快適な場合は、変更するだけです。

await async.Go();コードは実行されasync.Go();ますが、Console.WriteLineはヒットしません。

4

2 に答える 2

2

awaitエラーメッセージは、メソッドでのみ使用できることを正しく示していますasync。ただし、作成することはできませんMain() async。C#はそれをサポートしていません。

ただし、asyncメソッドTaskはsを返しTaskます。これは、.Net4.0以降のTPLで使用されているものと同じです。また、 sはメソッドを使用しTask同期待機をサポートします。したがって、次のようにコードを記述できます。Wait()

class Program
{
    static void Main(string[] args)
    {
        TestAsync async = new TestAsync();
        async.Go().Wait();
    }
}

ここでの使用は正しい解決策ですが、他の場合では、同期待機の使用と非同期待機の使用Wait()を混在させることは危険であり、デッドロックにつながる可能性があります(特にGUIアプリケーションまたはASP.NETで)。Wait()await

于 2012-08-21T20:25:31.693 に答える
-1

Webリクエストが完了する前に、プログラムが終了します。これは、メインが何もすることが残っていないため、非同期操作が完了するのを待たないためです。

あなたがメインを長持ちさせるなら、それConsole.WriteLineから呼ばれるでしょう。

asyncメソッドの呼び出し後にスリープを追加してみます--- Thread.Sleep(500)Webリクエストを完了するのに十分な長さであれば問題ありません。

于 2012-08-21T20:16:02.800 に答える