我在使异步操作正常工作时遇到了一些麻烦(异步操作的新手)。我的目标是让“加载数据”按钮退出并从数据库中检索一些数据并填充网格。对于某些用户而言,数据库可能有些远,此操作可能需要一些时间。考虑到这一点,我希望用户能够选择取消并选择检索较小的数据集。
我主要使用当前流程:
用户单击“加载数据...”按钮
按钮更改为“取消”,异步操作开始检索数据
检索数据并填充网格
这一切都运行良好,除了,如果用户单击取消,它仍然需要相同的时间来获取所有数据以使网格变为空。这让我相信长时间运行的操作实际上并没有被取消......但是,当我在“FindForLocationAsync”方法中调试时,如果用户请求取消令牌确实会停止迭代操作并提前从该方法返回消除。
很长一段时间以来,我一直在尽可能多地阅读,但是,我现在陷入了僵局。任何帮助将不胜感激。
取消令牌来源
CancellationTokenSource cancellationTokenSource = null;
按钮点击方法
private async void btnSearch_Click(object sender, EventArgs e)
{
gridLog.DataSource = null;
Cursor = Cursors.WaitCursor;
if (btnSearch.Text.ToLower().Contains("load"))
{
btnSearch.Text = "Cancel";
btnSearch.ForeColor = Color.White;
btnSearch.BackColor = Color.Red;
//get params to pass
/* snip */
cancellationTokenSource = new CancellationTokenSource();
await Task.Run(() =>
{
var ds = DocLog.FindForLocationAsync(docType, subType, days, currLocation.ID, cancellationTokenSource.Token).Result;
gridLog.DataSource = ds;
});
btnSearch.Text = "Load Data...";
btnSearch.ForeColor = Color.Black;
btnSearch.BackColor = Color.FromArgb(225, 225, 225);
}
else
{
cancelSearch();
btnSearch.Text = "Load Data...";
btnSearch.ForeColor = Color.Black;
btnSearch.BackColor = Color.FromArgb(225, 225, 225);
}
Cursor = Cursors.Default;
}
取消方法
private void cancelSearch()
{
if (cancellationTokenSource != null) cancellationTokenSource.Cancel();
}
长时间运行方法
RISEBY
相关分类