C# 如何停止填充数据表ASP.NET

C# 如何停止填充数据表ASP.NET,c#,asp.net,datatable,C#,Asp.net,Datatable,我没有找到任何关于停止填充数据表的可能性的答案。有没有办法做到这一点?我有来自OleDbDataAdapter的数据,有时我不得不等待2分钟,但我想告诉用户停止填充那么多数据,或者只是等待并继续 OleDbDataAdapter sqlArchiveData = new OleDbDataAdapter(sql_archive); DataTable dt = new DataTable(); conn.Open(); sqlArchiveData.Fill(dt); connProdc

我没有找到任何关于停止填充数据表的可能性的答案。有没有办法做到这一点?我有来自OleDbDataAdapter的数据,有时我不得不等待2分钟,但我想告诉用户停止填充那么多数据,或者只是等待并继续

OleDbDataAdapter sqlArchiveData = new OleDbDataAdapter(sql_archive);

DataTable dt = new DataTable();

conn.Open();

sqlArchiveData.Fill(dt);

connProdcc1.Close();

似乎您可以通过传递
CancellationToken
来处理取消填充。下面的示例生成了一个在ASP.NET中不是最优的,但应该会给您一些想法

示例摘自以下MSDN论坛帖子


不,没有办法直接阻止它。但是,您可以在另一个线程中填充它并根据需要终止该线程,但是在ASP.NET中旋转自己的线程是危险的。相反,您可能应该解决根本问题。为什么需要两分钟?你能优化查询吗?为什么要在网站中运行一个耗时2分钟的进程,而不是在后台服务中运行?您可以设置一个较低的查询超时并捕获异常。@dlatikay不允许用户等待并继续,但一旦超时,执行就完成了。@Adriano我将使用OleDbDataReader,每次读取一条记录,检查循环中经过的时间。如果时间超过2分钟,您可以向用户返回消息,但保持数据读取器处于打开状态(可能在会话[“CurrentDataReader”]属性中)。这并不理想,但您在此获得的体系结构也不正确。这还取决于基础RDBMS。例如,SQL Server也不支持“中止或继续等待”方法,除非在返回第一条记录之后,通常情况下,这将是瓶颈,而不是在获取记录后传输记录,除非数据集非常大。我尝试这样做,但当我添加按钮时,我可以调用其他事件,这只会阻止我执行Filling@Adriano这只是一个例子,我想说的是我想说的是,你可以将取消令牌传递给Row_Changed事件以停止填充。是的,我理解你的观点,但我认为我不够好,无法很好地使用它。无论如何,谢谢
private BackgroundWorker worker;
private DataTable table;

private void button2_Click(object sender, EventArgs e)
{
  if (worker != null)
  {
    worker.CancelAsync();
  }
}

private void button1_Click(object sender, EventArgs e)
{  
  this.worker = new BackgroundWorker();
  worker.WorkerReportsProgress = true;
  worker.WorkerSupportsCancellation = true;

  worker.DoWork += new DoWorkEventHandler(worker_DoWork);
  worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);

  worker.RunWorkerAsync();
}

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  MessageBox.Show(this.table.Rows.Count.ToString());
}

[System.Diagnostics.DebuggerStepThrough]
void worker_DoWork(object sender, DoWorkEventArgs e)
{
  this.table = new DataTable();

  using (SqlConnection connection= new SqlConnection())
  using (SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM table", connection))
  {
    table.RowChanged += new DataRowChangeEventHandler(table_RowChanged); 
    da.Fill(table);        
  }
}

[System.Diagnostics.DebuggerStepThrough]
void table_RowChanged(object sender, DataRowChangeEventArgs e)
{
  if (worker.CancellationPending)
  {
    throw new ApplicationException("Canceled"); // throw a spanner in the works
  }
  Thread.Sleep(5); // Just slow things down for testing
}