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
Running
cont
例外がスローされたときのデバッガーでのコードは次のようになります。
ほとんどの場合Dispose
、タスクを呼び出す必要はないことを認識しています。この質問は、なぜ継続がここでまったく発火しているのかについての詳細ですか?**