我目前正在用C#编写程序。 我想将大量数据(超过200,000倍的双倍值)保存到.csv文件中。这意味着我必须使用分号&#34 ;;"来隔离所有值。
这不是问题,但是当我想再次打开文件并读取数据时,应该将值绘制到图表中。
我逐行读取.csv文件,因为首先读取所有数据会导致内存溢出异常。我想在一个sepparate线程上执行此操作,因此表单不会被阻止。然后我还要调用图表。
现在多次调用控件需要花费很多时间。我在互联网上发现了类似的问题,其中定时器被用来解决问题。我已经使用了计时器而不是调用进度条,但万一,我不知道如何使用这个计时器。
这里有计时器吗?我该如何实现它?有不同的解决方案吗?
答案 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();
}