

現在2つのアプリケーション間でやり取りするために、間にテキストファイルを用意しています。  
テキストファイル内は以下のような記述となっています。  
行数は少なく、現時点では198行までしかない状態です。

[![画像の説明をここに入力](https://i.stack.imgur.com/Ltqzc.jpg)](https://i.stack.imgur.com/Ltqzc.jpg)

アプリケーション側のデザインはこのようになっています。  
チェックボックスを付けることで先ほどのテキストファイルのc??：の後の数値を0か1に変更しています。

[![画像の説明をここに入力](https://i.stack.imgur.com/5UK5M.jpg)](https://i.stack.imgur.com/5UK5M.jpg)

問題点はこのページを表示したときに、テキストファイルの数値を読み取ってチェックボックスにチェックを入れる関数を用意しました。  
ですが、速度が遅いため、ページ描画が終わるまでにチェックボックスの処理が終わりません。  
具体的には、190個のチェックボックスの制御をするのに5秒程掛かっています。  
どう改善すればテキスト読み書きのループ処理を高速化できるようになるのでしょうか。

[code]

    /* 全チェックボックスを順に取得し、別関数に送る */
    private async Task CheckIOClientMod( )
    {
        int mod , client ;
        int cMN = clientModNum;
        int cNN = clientNameNum - 1;
    
        for ( mod = 0 ; mod < cMN ; mod++ )
        {
            for ( client = 0 ; client < cNN ; client++ )
            {
                if ( clientModCheck[ mod , client ] != null )
                {
                    switch ( mod )
                    {
                        case 0: /* God */       await SetCheckIOClientMod( mod , client ); break;
                        case 1: /* InfAmmo */   await SetCheckIOClientMod( mod , client ); break;
                        case 2: /* UAV */       await SetCheckIOClientMod( mod , client ); break;
                        case 3: /* VSAT */      await SetCheckIOClientMod( mod , client ); break;
                        case 4: /* Laser */     await SetCheckIOClientMod( mod , client ); break;
                        case 5: /* WalkSpeed */ await SetCheckIOClientMod( mod , client ); break;
                        case 6: /* InfKS */     await SetCheckIOClientMod( mod , client ); break;
                        case 7: /* Freeze */    await SetCheckIOClientMod( mod , client ); break;
                        case 8: /* ToMe */      await SetCheckIOClientMod( mod , client ); break;
                        case 9: /* ToSky */     await SetCheckIOClientMod( mod , client ); break;
                    }
                }
            }
        }
    }
    
    /* 送られてきた種別、ユーザー番号からIO用テキストファイルより現在の数値状態を読み込む */
    private async Task SetCheckIOClientMod( int mod , int client )
    {
        string ct = "_c";
        if ( client < 10 ) 
            ct += "0";
    
        string path = def.Ps4Bo3Path;
        string target = "isMod" + def.ioClientModString[ mod ] + ct + client;
        string enable = def.Enable;
    
        if ( IOs.CheckStat( path , target ) == enable )
            clientModCheck[ mod , client ].Checked   = true;
        else
            clientModCheck[ mod , client ].Checked   = false;
    
        await waitTime( 1 );
    }
    
    
    #region 指定したステータス値を読み込む
    
    public string CheckStat( string path , string kw )
    {
        FileStream fs = new FileStream( path , FileMode.Open , FileAccess.Read , FileShare.ReadWrite ) ;    /* 排他制御 */
        StreamReader sr = new StreamReader( fs ) ;                                                          /* 排他制御 */
    
        string ans = "" ;                           /* 初期化 */
    
        while ( sr.Peek( ) > -1 )                   /* 全行読む */
        {
            string line = sr.ReadLine( ) ;          /* lineに1行分の文字列を代入 */
            if ( line.Contains( kw ) )              /* lineの中に指定した文字列があったら */
            {
                kw += ":" ;                         /* kwには:が含まれていないので追加する */
                int st = kw.Length ;                /* stに指定文字数を入れる */
                int ls = line.Length ;              /* lsに読み取った行の長さを入れる */
                int sp = ls - st ;                  /* 読み取り行 - 指定文字数 = あまりの部分 */
                ans = line.Substring( st , sp ) ;   /* ansにあまりの部分 - 指定文字数 間の文字を代入 */
            }
        }
    
        return ans ;                                /* ansを返す */
    }
    
    #endregion
    
[/code]


CC BY-SA 4.0
2018-10-11T14:42:38.023
49202
2018-10-11T23:19:24.000
2018-10-11T22:30:43.017
29866
29866
question
c# visual-studio テキストファイル
テキストデータの読み書きの高速化


プロファイラで各メソッドの所要時間を測定し、原因個所を特定すべきです。

* * *

`CheckIOClientMod()`が`SetCheckIOClientMod()`を190回呼び出すのは設計通りだと思います。しかし、`SetCheckIOClientMod()`が`CheckStat()`を呼び出しています。また`CheckStat()`はファイルを読み込んでいます。

つまりファイル読み込みが190回発生していますが、設計通りでしょうか？ 設計通りであればどうしようもありません。  
ファイルの読み書きはとても遅いので、可能であれば設計を見直し、１回で全データを読み込むべきです。


CC BY-SA 4.0
2018-10-11T23:19:24.000
49205
2018-10-11T23:19:24.000
4236
49202
answer