在C#,WinForms中调用大数据到图表对象

时间:2014-05-18 13:55:27

标签: c# performance timer invoke

我目前正在用C#编写程序。 我想将大量数据(超过200,000倍的双倍值)保存到.csv文件中。这意味着我必须使用分号&#34 ;;"来隔离所有值。

这不是问题,但是当我想再次打开文件并读取数据时,应该将值绘制到图表中。

我逐行读取.csv文件,因为首先读取所有数据会导致内存溢出异常。我想在一个sepparate线程上执行此操作,因此表单不会被阻止。然后我还要调用图表。

现在多次调用控件需要花费很多时间。我在互联网上发现了类似的问题,其中定时器被用来解决问题。我已经使用了计时器而不是调用进度条,但万一,我不知道如何使用这个计时器。

这里有计时器吗?我该如何实现它?有不同的解决方案吗?

1 个答案:

答案 0 :(得分:0)

您的问题并不是非常明确,但至少有一条信息可以回答您问题的两个部分:

  

我想在一个单独的[原文]主题上执行此操作,因此表单不会被阻止。

...

  

有不同的解决方案吗?

使用任务并行库肯定可以防止UI线程阻塞,而不需要为线程管理增加负担。

这也允许您显示执行这些任务所需的步骤"步骤"在你的进度栏。然后,您可以枚举这些步骤并显示一个真正的进度条而不是猜测的进度条。

protected void LoadData_Click(Object sender, EventArgs e)
{
    // Execute a task without blocking the calling method
    Task.Factory.StartNew(() => { LoadDataAsync(); });

    // method finishes, does not block on the task
}

private async void LoadDataAsync()
{
    // Await the load and use the remainder of this method as callback
    UpdateProgressBar();

    int position = 0;
    int take = Constants.PreferredFetchQuantity;
    int total = MoreThan200xDoubleValue;

    while (CheckCancellationToken == false && position <= total)
    {
        var Data = await Task.Run(FetchDataRowsSlowly(position, take));

        // the remainder is a nice readable callback

        position += take;
        UpdateProgressBar(position);
        foreach(var row in Data) SomeGridOrSomething.Add(row);

        // ...
    }
}

private Task<DataTable> FetchDataRowsSlowly(int start, int count)
{
    var db = WhateverDbContextOrWebAPICallOrWhatever();

    // return datatable, the framework will handle the Task<>
    return db.GiantTable.Skip(start).Take(count).ToDataTable();
}