1

私はC#を初めて使用します。これが私の最初の質問です、私に優しくしてください

データプロバイダーからいくつかのダニデータをキャプチャするアプリケーションを作成しようとしています。以下はプログラムの主要部分です

void zf_TickEvent(object sender, ZenFire.TickEventArgs e)
{

    output myoutput = new output();

    myoutput.time = e.TimeStamp;
    myoutput.product = e.Product.ToString();
    myoutput.type = Enum.GetName(typeof(ZenFire.TickType), e.Type);
    myoutput.price = e.Price;
    myoutput.volume = e.Volume;

    using (StreamWriter writer = File.AppendText("c:\\log222.txt"))
    {

        writer.Write(myoutput.time.ToString(timeFmt) + ",");
        writer.Write(myoutput.product + "," );
        writer.Write(myoutput.type + "," );
        writer.Write(myoutput.price + ",");
        writer.Write(myoutput.volume + ",");

    }

データをテキストファイルに正常に書き込むことができましたが、このメソッドはピーク時に1秒間に10000回呼び出され、ファイルを開いて1秒間に何度も追加するのは非常に非効率的であることがわかっています。バッファまたはある種の、しかし私はそれを行う方法がわかりません、私はドキュメントを読んでみますが、それでも理解できません、それで私は助けを求めてここに立ち寄ります。

書き込み方向を示すことができるように、いくつかの(作業中の)スニペットコードを教えてください。ありがとう

編集:私はコードを可能な限り単純化しました

    using (StreamWriter streamWriter = File.AppendText("c:\\output.txt"))
    {
        streamWriter.WriteLine(string.Format("{0},{1},{2},{3},{4}",
                        e.TimeStamp.ToString(timeFmt),
                        e.Product.ToString(),
                        Enum.GetName(typeof(ZenFire.TickType), e.Type),
                        e.Price,
                        e.Volume));
    }

EDから、フィールドへのストリームを作成するように指示されましたが、構文はどのようになっていますか?誰かが私を助けるためにいくつかのコードを投稿できますか?どうもありがとう

4

3 に答える 3

1

ローカル変数の代わりにストリームのフィールドを作成する必要があります。コンストラクターで一度初期化し、どこかで閉じることを忘れないでください。IDisposableインターフェイスを実装し、Dispose()メソッドでストリームを閉じる方が良いです。

I使い捨て

class MyClass : IDisposable {
    private StreamWriter _writer;

    MyClass() {
        _writer = File.App.....;
    }

    void zf_TickEvent(object sender, ZenFire.TickEventArgs e)
    {

        output myoutput = new output();

        myoutput.time = e.TimeStamp;
        myoutput.product = e.Product.ToString();
        myoutput.type = Enum.GetName(typeof(ZenFire.TickType), e.Type);
        myoutput.price = e.Price;
        myoutput.volume = e.Volume;


        _writer.Write(myoutput.time.ToString(timeFmt) + ",");
        _writer.Write(myoutput.product + "," );
        _writer.Write(myoutput.type + "," );
        _writer.Write(myoutput.price + ",");
        _writer.Write(myoutput.volume + ",");

    }

    public void Dispose() { /*see the documentation*/ }
}
于 2012-05-31T06:27:12.813 に答える
0

できることはたくさんあります

ステップ 1. io 呼び出しと文字列連結をあまり行わないようにします。

Output myOutput = new Outoput(e); // Maybe consruct from event args?

// Single write call, single string.format
writer.Write(string.Format("{0},{1},{2},{3},{4},{5}", 
  myOutput.Time.ToString(), 
  myOutput.Product, 
  ...);

これは、現在のパフォーマンスに関係なくお勧めします。また、いくつかの表面的な変更を加えました (変数/プロパティ/クラス名の大文字と小文字。変数とプロパティの違い、推奨されるケースなどを調べる必要があります)。

ステップ 2. パフォーマンスを分析して、期待どおりの結果が得られるかどうかを確認します。その場合は、これ以上何もする必要はありません。それでもパフォーマンスが悪い場合は、次のことができます。

  • ファイルを開いたままにし、ハンドラーがシャットダウンするときに閉じます。
  • バッファに書き込み、定期的にフラッシュします。
  • 上記を内部で処理し、複数のスレッドからのログ ファイルへのアクセスなどの厄介な問題を処理するlog4netなどのロガー フレームワークを使用します。
于 2012-05-31T06:29:57.167 に答える
-2

私は String.Format を使用します:

using (StreamWriter writer = new StreamWriter(@"c:\log222.txt", true))
        {
            writer.AutoFlush = true;
            writer.Write(String.Format("{0},{1},{2},{3},{4},", myoutput.time.ToString(timeFmt), 
                myoutput.product, myoutput.type, myoutput.price, myoutput.volume);
        }

string の前に使用する場合@、 double を使用する必要はありません\

これははるかに高速です。ファイルへの書き込みは 5 回ではなく 1 回だけです。さらに+、最速の操作ではない文字列で演算子を使用しません;)

また、これがマルチスレッド アプリケーションの場合は、何らかのロックの使用を検討する必要があります。たとえば、アプリケーションがファイルに書き込もうとするのを防ぎます。一度に2スレッド。

于 2012-05-31T06:24:25.100 に答える