いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

DevExpress奮闘記-112 (RealTimeSourceを試してみた, 120000件超のデータ読み込み, C# 5.0のasync/await利用)


以前、RealTimeSourceについての記事をアップしましたが、ついでにもう一つ作成してみたのでメモメモ。
ついでに、C# 5.0のasyncとawaitも利用してみた。


読み取りに利用したデータは以下のものです。


上記のページにある全国版のKEN_ALL.csvを利用してます。
データ件数は、120000件超です。


以下、サンプルです。
サンプルでは、以下のようにしてFormとデータソースを構築しています。

Form (XtraForm) <=> RealTimeSource(rtsMain) <=> BindingSource (bdsMain) <=> データ (Data)


以下、サンプルです。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using DevExpress.Skins;
using DevExpress.XtraEditors;

namespace WindowsFormsApplication1
{
  public partial class Form1 : XtraForm
  {
    public Form1()
    {
      SkinManager.EnableFormSkins();
      InitializeComponent();
      InitializeControls();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      SetDataAsync().GetAwaiter().OnCompleted(() => ssmMain.CloseWaitForm());
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
      ssmMain.ShowWaitForm();
    }

    void InitializeControls()
    {
      bdsMain.DataSource = typeof(Data);

      rtsMain.DisplayableProperties = string.Join(";", typeof(Data).GetProperties().Select(x => x.Name).ToArray());
      rtsMain.DataSource            = bdsMain;

      grdMain.DataSource           = rtsMain;
      grdMain.UseEmbeddedNavigator = true;

      grvMain.OptionsBehavior.Editable = false;
    }

    async Task SetDataAsync()
    {
      using (var reader = new StreamReader(@"KEN_ALL.csv", Encoding.GetEncoding("sjis")))
      {
        for (var line = await reader.ReadLineAsync(); line != null; line = await reader.ReadLineAsync())
        {
          var fields = line.Split(',');

          bdsMain.Add(
            new Data()
            { 
              PostCode = fields[(int) DataLayout.PostCode],
              Address1 = fields[(int) DataLayout.Address1],
              Address2 = fields[(int) DataLayout.Address2],
              Address3 = fields[(int) DataLayout.Address3]
            }
          );
        }
      }
    }

    enum DataLayout
    {
      PostCode = 2,
      Address1 = 6,
      Address2 = 7,
      Address3 = 8
    }

    class Data
    {
      public string PostCode { get; set; }
      public string Address1 { get; set; }
      public string Address2 { get; set; }
      public string Address3 { get; set; }
    }
  }
}


起動すると、以下のように非同期で読み込みが行われながら
UIが更新されていきます。読み込み中でもUIは普通に触れます。


今回のサンプルは、以下の場所にアップしてあります。お試しになる方はどうぞ。
VisualStudio 2012で作成しています。.NET Framework 4.5が対象です。

================================
過去の記事については、以下のページからご参照下さい。