2

私は次のコードを持っていますが、マルチスレッド化の概念を高レベルで確実に理解したいだけです。

public async Task<List<Category>> GetProjectsByCategoryIDAsync(Int16 categoryid)
    {
        try
        {
            using (YeagerTechEntities DbContext = new YeagerTechEntities())
            {
                DbContext.Configuration.ProxyCreationEnabled = false;
                DbContext.Database.Connection.Open();

                var category = await DbContext.Categories.Include("Projects").Where(p => p.CategoryID == categoryid).ToListAsync();

                return category;
            }
        }
        catch (Exception)
        {
            throw;
        }
    }

それは以下の私の理解です:

  1. async - 同期ではなく非同期で実行するメソッドを宣言します。
  2. Task - 単一スレッドでタスクとして実行するメソッドを宣言します
  3. await - タスクは操作が完了するまで待機します。

私が少し曖昧なのは、 await キーワードです。明らかに、非同期プログラミングの利点は、別の要求がすぐ後ろに来る前に、メソッドがタスクの完了を待つ必要がないことです。ただし、await キーワードを使用すると、タスクは操作が完了するまで待機します。

同期プログラミングでは、すべてが順次パターンで処理されます。

この方法論では、どのようにして要求が同時に入ってきて、同期プログラミングよりもはるかに高速に実行できるのでしょうか??

概念を理解するには、高レベルの説明が必要です。

よろしくお願いします。

4

1 に答える 1

5

次のコードを検討してください。

    public async Task DoSomething()
    {
        Console.WriteLine("Begin");
        int i = await DoSomethingElse();
        Console.WriteLine("End " + i);
    }

    public Task<int> DoSomethingElse()
    {
        return new Task<int>(() =>
        {
            // do heavy work
            Thread.Sleep(1000);
            return 1;
        });

    }

同期プログラミングでは、すべてが順次パターンで処理されます。

上記のコードは非同期ですが、まだシーケンシャルです。public int DoSomethingElseそのコードとその同期バージョン (例: )の違いは、DoSomethingElse が完了するのを待つのをブロックawait DoSomethingElseするのではなく、メイン スレッドが他の作業を行うために解放されることです。

実際に何が起こるかというと、非同期の DoSomething メソッドがスレッド A で実行され、2 つに分割されます。

  • 最初の部分は "Begin" を出力して非同期呼び出しを行い、次に を返します。
  • 2番目の部分は「End」を出力します

メソッドの最初の部分が実行された後、スレッド A は自由に他の作業を行うことができます。一方、スレッド B は、重い作業を行うラムダ式を実行します。スレッド B が完了するたびに、メソッドの 2 番目の部分がスレッド A で実行されるようにスケジュールされ、「End」が出力されます。

スレッド B が負荷の高い作業を実行している間、スレッド A は自由に他の作業を実行できることに注意してください。

この方法論では、どのようにしてリクエストが同時に入ってきて、同期プログラミングよりもはるかに高速に実行できるのでしょうか??

ASP.NET MVC などのフレームワークでは、アプリケーションが着信要求を処理するために使用できるスレッドの数は限られています (これらを「要求スレッド」と呼びましょう)。負荷の高い作業を他のスレッドに委任して待機することにより、負荷の高い作業が行われている、リクエスト スレッドはより多くの受信リクエストを自由に処理できるようになります。

この図は複雑ですが、非同期作業を実行するスレッドの実行/中断フローを示しています。

ここに画像の説明を入力

ステップ 6 でスレッドが生成され、ステップ 7 でメソッドの実行が再開されたことに注意してください。ご覧のとおり、awaitキーワードはメソッドを効果的に 2 つに分割します。

于 2013-11-05T16:36:02.697 に答える