我有以下代码来构建从 SQL Server 中提取的高级数据结构,然后当该数据的检索完成时,我会更新 UI。使用的代码是
private void BuildSelectedTreeViewSectionAsync(TreeNode selectedNode)
{
// Initialise.
SqlServer instance = null;
SqlServer.Database database = null;
// Build and expand the TreeNode.
Task task = null;
task = Task.Factory.StartNew(() => {
string[] tmpStrArr = selectedNode.Text.Split(' ');
string strDatabaseName = tmpStrArr[0];
instance = SqlServer.Instance(this.conn);
database = instance.GetDatabaseFromName(strDatabaseName);
}).ContinueWith(cont => {
instance.BuildTreeViewForSelectedDatabase(this.customTreeViewSql,
selectedNode, database);
selectedNode.Expand();
task.Dispose();
}, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion,
this.MainUiScheduler);
}
这在我的主要开发机器上可以正常工作;也就是说,它完成了database
对象的构建,然后在继续更新 UI 并处置task
(任务对象)。
但是,我一直在另一台机器上进行一些测试,我得到了一个InvalidOperationException
,这是由于task.Dispose()
在task
which 上仍然处于状态,但是除非任务已经完成,否则不会触发Running
延续。cont
抛出异常时,调试器中的代码如下所示:
我知道调用Dispose
任务几乎总是不必要的。这个问题更多地是关于为什么继续在这里触发?**