スタートボタンとストップボタンで制御されるCSVファイルを作成する方法

JITIN MALHOTRA

データ(約70kの値)を配列に入れて、最小限の時間でcsvファイルに転送するWindowsフォームアプリケーションを設計したいと思います。csvファイルのパスと名前は、Windowsフォームアプリケーションによって指定されます。

データ転送は、startという名前の最初のボタンが押されたときにのみ実行され、値の数に関係なく、2番目のボタンstopが押されたときに停止する必要があります。

コードは次のとおりです。

public static void Write(double[] data, string outputPath)
{ 
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < data.GetLength(0); i++)
    {
        sb.AppendLine(string.Join(",", data[i]));
    }
    File.WriteAllText(outputPath, sb.ToString());
}

これは私が使用している関数で、配列であるvaribaledscaledDataを持っています。この配列から値を取得してcsvファイルに保存したい

Write(dScaledData, @csvadd);

@の部分は、名前の付いたcsvパスを示しています。dscaledData変数に格納されているデータ値は非常に大きいです。70k

TaW

停止ボタンを使用して、書き込みループをなんらかの方法で中断したいとします。しかし、それがそうであるように、それは実行を続け、実際にuiスレッドをブロックします。したがって、別のスレッドで書き込みループを実行する必要があります。

.NET、例えばAでそれを行うための様々な方法がありTask.FactorythreadsまたはBackgroundWorker

これは、Task.Factoryを使用した単純ですが効果的な実装です。

stoppedから設定およびリセットするクラスレベル変数を作成しますButtonsそこキャンセルする他、より複雑な方法ですTaskここを参照してくださいが、これは目的のために十分良い..です

私のテストでは、ダミーデータも作成します。

private void cb_Stop_Click(object sender, EventArgs e)
{  stopped = true;   // this will be checked in our output loop   }

private void cb_Start_Click(object sender, EventArgs e)
{
    stopped = false;
    // create my test data..
    List<double> data = new List<double>();
    for (int i = 0; i < 10000000; i++) data.Add((i+ 1d) / i * 1d );
    string filename = "D:\\xxxxx.txt";

    // this is an optional callback to provide feedback. 
    // It obviuosly slows things down greatly..
    Action<int> callback = (value) => st_lines.Invoke(new Action(() 
                         => st_lines.Text = value + " lines written.."));
    // now we start the write loop in another task..
    // ..passing in our data and (optinally) the callback
    Task myFirstTask = Task.Factory.StartNew(() 
                     => Write(data.ToArray(), filename, callback));
}

static bool stopped = true;   // our flag

public static void Write(double[] data, string outputPath, Action<int> aCallback)
{    // your write loop
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < data.GetLength(0); i++)
    {
        if (stopped) break;   // our new test
        sb.AppendLine(string.Join(",", data[i]));
        aCallback( i );       // optional callback
    }
    File.WriteAllText(outputPath, sb.ToString());
}

タイミング状況に関するいくつかの注意事項:

70k行をに追加するのにそれほどStringBuilder時間はかからないはずです。私のコードを見てください。マシンの停止ボタンを押すことさえできるようにするには、テストデータを最大1,000万までクランクする必要がありました

データの作成がボトルネックであるか、ディスクへの書き込みである可能性があります。または多分ボトルネックはありませんか?実装を決定する前に、これを理解する必要があります。

他の部分がボトルネックとして識別された場合、他のループから抜け出すためにそれに応じてコードを変更する必要があります。

タスクの進行状況に関する情報をUIスレッドに戻す方法を確認できるように、コールバックメカニズムを追加しました。これは、タスクを停止することが理にかなっているかどうかをユーザーが判断するのに役立ちます。

ただし、コールバックを追加すると処理速度が大幅に低下するため、1行ごとに呼び出す代わりに、次のように行うことができます。if (i % 1000 == 0 ) aCallback(i);進行状況ラベル(またはProgressBarもちろん)を1000行ごとに更新するだけです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ブートストラップウィザードのモーダルファイナルボタンを制御する方法

分類Dev

txtファイルの値を変更するボタンを制御するphpスクリプトを作成しようとしています

分類Dev

JavaScriptでタイムラインのステップを制御するボタンを作成する方法

分類Dev

ボタンとリストで作成されたドロップダウンで依存関係を作成する方法

分類Dev

Angularでカスタムファイルアップロードボタンを作成する方法

分類Dev

スクリプトからファイルがアップロードされていないときに [送信] ボタンを防止する方法は?

分類Dev

グーグルプレイスコンサルト機能にリンクされたボタンでTkinterインターフェースを作成する

分類Dev

スライダーボタンでセグメント化されたコントロールウィジェットを作成する-フラッター

分類Dev

AndroidStudioでプレイリストボタンとリピートボタンをシャッフルするにはどうすればよいですか?

分類Dev

チェックされたラジオボタンを取得する方法とリストビューで選択された1つのラジオボタンのみを制御する方法

分類Dev

ボトルアプリでマルチプロセスを使用すると、複数のボトルインスタンスが作成されます

分類Dev

ボタンをタップするとテキストフィールドが表示されます

分類Dev

ブラウザの戻るボタンでJQueryマルチステップフォームを制御する

分類Dev

リーフレットタグフィルターボタンとMarkerCluster.LayerSupportプラグイン-クリック時にフィルターを作成するための統合により、クラスターが更新されます

分類Dev

新しく作成されたリストにタイトル属性を追加するJqueryオートコンプリートコンボボックス

分類Dev

ブートストラップを使用してボタンを応答させた場合でも、CSS ファイルが原因でボタンが重なる

分類Dev

コンポーネントが、ReactJSで制御されるタイプチェックボックスの制御されていない入力を変更しています

分類Dev

ブートストラップでテキストと画像を使用してボタンを作成する方法

分類Dev

ボタンが押されたときにフラッターのテキストスタイルを変更する方法

分類Dev

プロットグラフでカスタムモードバーボタンアイコンを作成する

分類Dev

動的に作成されたボタンにブートストラップツールチップを追加する

分類Dev

CSSスタイルのファイルアップロードボタンのクローンを作成する

分類Dev

Dockerでホストされている.NET Coreコンソールアプリケーションのライフタイムを制御する

分類Dev

VirtualBox VMのアダプタが内部ネットワークに設定されている場合、ホストマシンのファイアウォールはゲストVMのポートへのアクセスを制御できますか?

分類Dev

キーボードが表示されているときにフラッターバックボタンをインターセプトする方法

分類Dev

ブートストラップラジオボタングループで同じ高さのラベルと値を作成する方法

分類Dev

Pythonでcsvファイルからデータをプロット/ストリーミングする方法は?

分類Dev

.psファイルでプリンターを制御する

分類Dev

C#グループボックスのタイトルをラジオボタンとして作成することはできますか?

Related 関連記事

  1. 1

    ブートストラップウィザードのモーダルファイナルボタンを制御する方法

  2. 2

    txtファイルの値を変更するボタンを制御するphpスクリプトを作成しようとしています

  3. 3

    JavaScriptでタイムラインのステップを制御するボタンを作成する方法

  4. 4

    ボタンとリストで作成されたドロップダウンで依存関係を作成する方法

  5. 5

    Angularでカスタムファイルアップロードボタンを作成する方法

  6. 6

    スクリプトからファイルがアップロードされていないときに [送信] ボタンを防止する方法は?

  7. 7

    グーグルプレイスコンサルト機能にリンクされたボタンでTkinterインターフェースを作成する

  8. 8

    スライダーボタンでセグメント化されたコントロールウィジェットを作成する-フラッター

  9. 9

    AndroidStudioでプレイリストボタンとリピートボタンをシャッフルするにはどうすればよいですか?

  10. 10

    チェックされたラジオボタンを取得する方法とリストビューで選択された1つのラジオボタンのみを制御する方法

  11. 11

    ボトルアプリでマルチプロセスを使用すると、複数のボトルインスタンスが作成されます

  12. 12

    ボタンをタップするとテキストフィールドが表示されます

  13. 13

    ブラウザの戻るボタンでJQueryマルチステップフォームを制御する

  14. 14

    リーフレットタグフィルターボタンとMarkerCluster.LayerSupportプラグイン-クリック時にフィルターを作成するための統合により、クラスターが更新されます

  15. 15

    新しく作成されたリストにタイトル属性を追加するJqueryオートコンプリートコンボボックス

  16. 16

    ブートストラップを使用してボタンを応答させた場合でも、CSS ファイルが原因でボタンが重なる

  17. 17

    コンポーネントが、ReactJSで制御されるタイプチェックボックスの制御されていない入力を変更しています

  18. 18

    ブートストラップでテキストと画像を使用してボタンを作成する方法

  19. 19

    ボタンが押されたときにフラッターのテキストスタイルを変更する方法

  20. 20

    プロットグラフでカスタムモードバーボタンアイコンを作成する

  21. 21

    動的に作成されたボタンにブートストラップツールチップを追加する

  22. 22

    CSSスタイルのファイルアップロードボタンのクローンを作成する

  23. 23

    Dockerでホストされている.NET Coreコンソールアプリケーションのライフタイムを制御する

  24. 24

    VirtualBox VMのアダプタが内部ネットワークに設定されている場合、ホストマシンのファイアウォールはゲストVMのポートへのアクセスを制御できますか?

  25. 25

    キーボードが表示されているときにフラッターバックボタンをインターセプトする方法

  26. 26

    ブートストラップラジオボタングループで同じ高さのラベルと値を作成する方法

  27. 27

    Pythonでcsvファイルからデータをプロット/ストリーミングする方法は?

  28. 28

    .psファイルでプリンターを制御する

  29. 29

    C#グループボックスのタイトルをラジオボタンとして作成することはできますか?

ホットタグ

アーカイブ