场景:我们有一个附加到DataAdapter(datatable)的DataGridView,我们在一个单独的线程中使用(adapter.fill(query,datatable))在datatable中加载数据(使用delegate和beginInvoke),一旦加载了数据,我们附加了数据表到datagridview(在主线程中)
有没有办法可以检查fill()是否仍在执行并取消它.
真实场景:用户点击用户名,相应的数据将加载到数据网格中.有时,用户不耐烦并点击另一个用户(这里我要取消之前的填充并开始新的填充)
更新:我们保留两个DataApdater(和两个DataTables),我们将一个数据表附加到datagridview,并开始异步地将数据加载到另一个数据表.加载数据时,我们只需将datagridview绑定到我们刚刚填充的DataTable(并开始异步加载以前的数据)这样UI将始终获取当前数据(无需用户在UI上等待刷新或挂起)
没有可以安全取消的设施DataAdapter.Fill()。
要解决此问题,一种选择是实现一种机制,该机制可以导致这些不需要的填充被忽略,从而不会反映在 UI 中。我建议在异步操作开始时增加计数器并将该状态传递给异步操作。然后,您的异步操作可以在完成时根据当前计数器检查其计数器值。如果计数器不相等,则不要更新 UI。
如果您发现用户在用户之间快速单击并且大量请求被丢弃的模式,那么请实现一个计时器机制,仅当用户在选择上停留最短时间时才检索数据。