C#で時間のかかるA処理B処理の合間にちょっとした処理をして
その後、処理A・処理Bが完了したら次の処理を行う場合

using System;
using System.Threading.Tasks;

var stopwatch = System.Diagnostics.Stopwatch.StartNew();
stopwatch.Start();

// 時間のかかる処理
var taskA = MethodA();

Console.WriteLine("ちょっとした処理①");

// 別の時間のかかる処理
var taskB = MethodB();

Console.WriteLine("ちょっとした処理②");

// A, Bの完了を待つ
await Task.WhenAll(taskA, taskB);

Console.WriteLine("A,Bの結果を使って次の処理を実行");

stopwatch.Stop();

Console.WriteLine($"処理時間: {stopwatch.ElapsedMilliseconds / 1000} s");

static async Task MethodA()
{
    await Task.Delay(5000);
    Console.WriteLine("MethodA完了");
}

static async Task MethodB()
{
    await Task.Delay(5000);
    Console.WriteLine("MethodB完了");
}

こんな感じになり、実行結果は、以下のようになる

ちょっとした処理①
ちょっとした処理②
MethodA完了
MethodB完了
A,Bの結果を使って次の処理を実行
処理時間: 5 s

これをJavaScriptでどう書くのか知りたかった。

(async () => {
    const start = Date.now();

    // 時間のかかる処理
    const taskA = methodA();

    console.log("ちょっとした処理①");

    // 別の時間のかかる処理
    const taskB = methodB();

    console.log("ちょっとした処理②");

    // A, Bの完了を待つ
    await Promise.all([taskA, taskB]);

    console.log("A,Bの結果を使って次の処理を実行");

    const elapsed = (Date.now() - start) / 1000;
    console.log(`処理時間: ${elapsed} s`);

})();

async function methodA() {
    await new Promise(resolve => setTimeout(resolve, 5000)); // 5秒
    console.log("methodA完了");
}

async function methodB() {
    await new Promise(resolve => setTimeout(resolve, 5000)); // 5秒
    console.log("methodB完了");
}
ちょっとした処理①
ちょっとした処理②
methodA完了
methodB完了
A,Bの結果を使って次の処理を実行
処理時間: 5.007 s
投稿日時: 2025-10-27 13:37:27

DataBaseは、SQL Serverで、データはAdventureWorks2022をいれています
→AdventureWorksについて

複数のSQLを1リクエストで投げて、結果を受け取るため

  • QueryMultiple
  • QueryMultipleAsync

を使います

そこから得た結果に対し、それぞれのSQLで取得されるであろう結果のレコード数に応じて以下を使い分ける感じ

メソッド 0件 1件 2件以上
Read 0件 レコード 複数レコード
ReadSingleOrDefault null レコード 例外発生
ReadSingle null レコード 例外発生
ReadFirstOrDefault null レコード 最初のレコード
ReadFirst 例外発生 レコード 最初のレコード

※Asyncをつければ非同期版
※Singleは結果が1行じゃないと例外発生、Firstは最初の1行だけ返す

サンプル:
1回のリクエストで男性女性わけてデータを取り出す例

Employee.cs

namespace SampleDapper.Models.HumanResources
{
    public class Employee
    {
        // テーブルから取得したい列の情報を定義
        public int BusinessEntityID { get; set; }
        public string JobTitle { get; set; } = null!;
        public DateTime BirthDate { get; set; }
        public char Gender { get; set; }
        public DateTime HireDate { get; set; }
    }
}

Program.cs

using Dapper;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using SampleDapper.Models.HumanResources;

try
{
    var config = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile(@"appsettings.json")
                    .Build();

    var connectStr = config["ConnectionStrings:DefaultConnection"];

    using (var connection = new SqlConnection(connectStr))
    {
        connection.Open();

        // 任意の件数、取得するSQL
        var sql = @"
                    SELECT * FROM HumanResources.Employee WHERE Gender = @Gender1;
                    SELECT * FROM HumanResources.Employee WHERE Gender = @Gender2;
                   ";

        // SQL中のパラメータに渡す値を設定
        var parameters = new { Gender1 = 'F', Gender2 = 'M' };

        using (var multi = connection.QueryMultiple(sql, parameters))
        {
            var femaleEmployees = multi.Read<Employee>();
            var maleEmployees = multi.Read<Employee>();
        }
    }
}
catch(Exception ex)
{
    Console.Write(ex.ToString());
}
投稿日時: 2025-09-14 02:07:14

最近の投稿

最近のコメント

タグ

アーカイブ

その他