【发布时间】:2016-05-12 21:55:38
【问题描述】:
我有不同的类(实现接口),其中一种方法是执行异步数据库搜索:
public async void SearchAsync(CancellationToken ct)
{
await Task.Run(() => {Find(); }, ct);
}
private void Find()
{
//do db search here...
}
当打开表单时,会执行后台异步搜索以加快用户输入,所以我要做的是:
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
try
{
//Get list of items that will perform async search...
//var results = ...
//Do an async search
Task task = Task.Factory.StartNew(() =>
{
foreach (var item in results)
{
item.SearchAsync(cts.Token);
}
}, cts.Token);
}
catch (OperationCanceledException)
{ }
}
以防万一用户在任务仍在执行时关闭表单,我会这样做:
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
if (cts != null)
{
cts.Cancel();
}
}
首先,以上是执行异步操作的正确方法吗?
其次,当我在任务仍未完成时关闭表单时,代码永远不会到达 OperationCancelException。莫非是上面的实现不正确?
【问题讨论】:
标签: c# winforms asynchronous task-parallel-library