0

我有一个程序可以对数百万条记录进行彻底的计算。有时,它运行一个多小时,有时大约 30 分钟。在此期间,程序没有响应或无法点击。有什么解决方法吗?比如,加载鼠标图标。

另一个问题是,如果我将两个字典作为数据网格的数据源,与读取 csv 文件并将其放入数据网格相比,速度非常慢。这是算法:

for i = 0 to last record
    datarow row = new datarow
    put i to row[0]
    put names[i] to row[1]
    put comments[i] to row[2]
    add row to datatable
end for loop
datatable.acceptchanges()
datagridview.datasource = datatable

注意:names[i] 和 comments[i] 是字典。但是,如果我只是从具有几乎相同循环的 csv 文件中读取并将其放入数据表并使其作为 datagridview 的数据源,它会更快(与 20 分钟的字典相比,大约需要 5-10 分钟)。有什么解决方法吗?

4

4 回答 4

3

您所要做的就是使用一些多线程在 UI 线程以外的线程上执行长时间运行的进程:

var task = new Task(() =>
{
    // do some work to get your dataTable
    dataTable.AcceptChanges();
    datagridview
        .Invoke(new Action(() => datagridview.DataSource = dataTable));
});

task.Start();
于 2012-04-27T00:59:14.143 回答
1

假设您使用的是 .NET 4,请使用Task该类。它将在后台线程上运行作业,同时让您的 GUI 保持响应。

即使您不使用 .NET 4,也可以使用简单的多线程类。我很可能会使用BackgroundWorker.

于 2012-04-27T00:59:18.567 回答
0

我会使用一个任务在后台运行它。这样你的 UI 线程就不会在任务运行时被锁定。

 var task = new Task(() =>
 {
  for i = 0 to last record
     datarow row = new datarow
     put i to row[0]
     put names[i] to row[1]
     put comments[i] to row[2]
     add row to datatable
  end for loop
  datatable.acceptchanges()
 });

 // Start the task.
 task.Start();

 task.ContinueWith(t =>
 {
    datagridview.datasource = datatable
 }, TaskScheduler.FromCurrentSynchronizationContext());

您需要在 UI 线程中分配数据源,否则会出现异常。这就是 TaskScheduler 位将为您做的事情。任务完成后,您的延续将在 UI 线程上运行(假设您从 UI 线程设置延续)。

于 2012-04-27T01:09:39.380 回答
0

尝试这个:

var taskA = new Task(() => {
 for i = 0 to last record
    datarow row = new datarow
    put i to row[0]
    put names[i] to row[1]
    put comments[i] to row[2]
    add row to datatable
 end for loop
 datatable.acceptchanges()
 datagridview.datasource = datatable
});

// Start the task.
taskA.Start();

查看更多关于任务

于 2012-04-27T01:01:23.330 回答