23

フィールドを非同期で読み取ることに何かメリットはありますか?

私が次のものを持っているかどうか言ってください:

SqlDataReader reader = await cmd.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
    try
    {
        if (reader.IsDBNull(COL_NAME))
        {
            continue;
        }

        user = new User();
        user.Id = reader.GetInt32(COL_ID);

IsDBNullAsyncandなどを使用することで、実際にメリットはありますGetInt32Asyncか?

4

2 に答える 2

8

公式のADO.NET ドキュメントからのスニペットを使用して、Marc が書いたことを繰り返します - 残念ながら Microsoft ブログ アーカイブに移動されました:

Read vs ReadAsync – ReadAsync を呼び出すこともお勧めします。ノンシーケンシャル モードでは、これによりすべての列データが読み込まれ、複数のパケットにまたがる可能性があるため、列値へのアクセスが高速になります。シーケンシャル モードでは、ADO.NET は現在の行のデータの読み取りを完了する必要があり (データが完全に読み取られていない場合)、一部の TDS トークンが行の間に存在し、非同期で読み取ることができる可能性があります。

IsDBNull と GetFieldValue vs IsDBNullAsync と GetFieldValueAsync- 以前に ReadAsync を呼び出していて、非順次アクセスを使用している場合、これらのメソッドの同期バージョンを呼び出すと、列データが既に読み取られて処理されているため、最高のパフォーマンスが得られます (したがって、非同期メソッドを呼び出すと、ラッピングのオーバーヘッドが追加されるだけです)タスクの値)。ただし、非シーケンシャル アクセス モードで Read を呼び出した場合、またはシーケンシャル アクセス モードを使用している場合は、目的の列に到達するために読み取る必要があるデータの量とデータの量を考慮する必要があるため、決定ははるかに困難です。その列に含まれる可能性があります。前の列を読んだことがあり、対象の列が小さい (Boolean、DateTime、または数値型など) 場合は、同期メソッドの使用を検討することをお勧めします。あるいは、ターゲット列が大きい (varbinary(8000) のように) 場合、または過去の大きな列を読み取る必要がある場合は、非同期メソッドを使用する方がはるかに優れています。最後に、ターゲット列が大規模な場合 (varbinary(MAX)、varchar(MAX)、nvarchar(MAX)、XML など)、新しい代わりにGetStreamGetTextReaderまたはGetXmlReaderメソッドを使用してください。

于 2020-03-15T18:03:02.680 に答える