我对C#很新,这是我的第一个问题,请温柔地对待我
我正在尝试编写一个应用程序来从数据提供程序中捕获一些tick数据,下面是该程序的主要部分
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 + ",");
}
我已经成功地将数据写入文本文件,但是我知道这个方法在高峰时间每秒会被调用10000次,并且打开一个文件并且每秒附加多次是非常低效的,我被指出使用缓冲区或某种类型,但我不知道如何做到这一点,我尝试阅读文档,但我仍然不明白,这就是为什么我来这里寻求帮助。
请给我一些(工作)片段代码,以便我可以指向写入方向。感谢
编辑:我尽可能地简化了代码
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告诉我让我的流到一个字段,语法是什么样的?任何人都可以发布一些代码来帮助我吗?非常感谢
答案 0 :(得分:1)
您需要为流而不是本地变量创建一个字段。在构造函数中初始化一次,不要忘记在某处关闭它。最好实现IDisposable
接口并在Dispose()
方法中关闭流。
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*/ }
}
答案 1 :(得分: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.分析您的表现,看它是否符合您的要求。如果确实如此,则无需再做任何事情。如果表现仍然太差,你可以
答案 2 :(得分:-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);
}
如果您在字符串前使用@
,则不必使用双\
。
这要快得多 - 你只需要写一次文件而不是5次。另外,不要将+
运算符用于不是最快运算的字符串;)
另外 - 如果这是多线程应用程序 - 你应该考虑使用一些锁。它会阻止应用程序尝试从例如写入文件。一次2个线程。