タスクの本体内でこのコマンドの接続を作成して開く必要があります。それか、タスクの外部で接続を閉じないでください。これは、ここで行っていることだと思いますが、貼り付けた1行のコードからはわかりません。
私は個人的にそれをすべて Task 本体内で行います。必要がないのに、接続/コマンドのセットアップを取得するまで待つ必要があるのはなぜですか? また、接続が共有インスタンスであり、スレッド間で機能しない可能性もあります。
DB作業をタスクに入れると、デフォルトでスレッドプールスレッドで実行され、WPFディスパッチャースレッドが解放されてUIイベントの処理に戻り、「フリーズ」が防止されます。ほとんどの場合、DB タスクが完了した後に UI を更新する必要があり、そのためには継続タスクを追加するだけですが、その継続タスクから UI を操作できるようにするには、明示的にスケジュールされていることを確認する必要があります。 Dispatcher スレッドで実行します。これは、継続をスケジュールする際に、現在の同期コンテキストの TaskScheduler を明示的に指定することによって行われます。それは次のようになります。
Task backgroundDBTask = Task.Factory.StartNew(() =>
{
... DB work here ...
});
backgroundDBTask.ContinueWith((t) =>
{
... UI update work here ...
},
TaskScheduler.FromCurrentSynchronizationContext());
ここでの魔法はTaskScheduler::FromCurrentSynchronizationContext
、現在の呼び出しの Dispatcher スレッドで実行される継続をスケジュールするメソッドの使用です。