.NET 4.5 非同期


.NET 4.5 非同期並列化
.NETの非同期は割合楽に913秒 (15分)の処理を334秒 (5分半)程度に出来たりする。
CPU使う処理がどれほどあるかって話があるが。。。

CPU使う処理でないとあまり意味がなくかつデータ関連ならばDBMSに計算させるのがベストだったりするので
なんの処理をどうするか?と言う勘所が重要だが、適当に書いてもそれなり動く

下記お試しコード ( UnionAggregateクエリ投げるのがベスト )

メインスレッド

      using (SqlConnection con1 = new SqlConnection(connectionString))
      using (SqlConnection con2 = new SqlConnection(connectionString))
      {
        con1.Open();
        con2.Open();

        string query1 = @"
SELECT
  Shape
FROM 
  JPN71";
        string query2 = @"
SELECT
  Shape
FROM 
  JPN71WEB";

        DateTime time = DateTime.Now;

        Task t1 = GetSQLGeom(con1, query1);
        Task t2 = GetSQLGeom(con2, query2);

        t1.Wait();
        t2.Wait();

        DateTime now1 = DateTime.Now;
        DateTime time2 = now1;

        Test(con1, query1);
        Test(con2, query2);

        Console.WriteLine((DateTime.Now - time2).TotalMilliseconds + "ms");
        Console.WriteLine("async" + (now1 - time).TotalMilliseconds.ToString() + "ms");
      }

直列と並列のメソッド

    static void Test(SqlConnection con, string query)
    {
      using (SqlCommand cmd = con.CreateCommand())
      {
        cmd.CommandText = query;
        cmd.CommandType = System.Data.CommandType.Text;
        using (var reader = cmd.ExecuteReader())
        {
          SqlGeometry union = null;
          while (reader.Read())
          {
            SqlGeometry geom = (SqlGeometry)reader[0];

            //Console.WriteLine(geom.STArea().Value.ToString());
            if (union != null)
              union = union.STUnion(geom);
            else
              union = geom;
          }//end loop
          Console.WriteLine(union.STArea().Value.ToString());
        }
      }
    }

    static async Task GetSQLGeom(SqlConnection con, string query)
    {

      using (SqlCommand cmd = con.CreateCommand())
      {
        cmd.CommandText = query;
        cmd.CommandType = System.Data.CommandType.Text;
        using(var reader = await cmd.ExecuteReaderAsync().ConfigureAwait(false))
        {
          SqlGeometry union = null;
          while (await reader.ReadAsync().ConfigureAwait(false))
          {
            SqlGeometry geom = (SqlGeometry)reader[0];
            //Console.WriteLine(geom.STArea().Value.ToString() );
            if (union != null)
              union = union.STUnion(geom);
            else
              union = geom;
          }//end loop
          Console.WriteLine(union.STArea().Value.ToString());
        }//end reader

      }//end cmd

    }
カテゴリー: 開発 タグ: パーマリンク