1

データベースからデータを読み取り、いくつかの作業を行う C# WPF アプリケーションがあります。しかし問題は、データを読み取っているときに UI が応答しないことです。タスクとディスパッチャーを試しました。それらのどれも役に立ちません。以下のコードは、button_click イベントにあります。コードは次のとおりです。

DataSet ds;
DataTable dt = new DataTable();

Task myTask = new Task(new Action(() =>
{
     //GetMyDataSet() returns DataSet
     ds = GetMyDataSet();
     dt = ds.Tables["MyTableName"];
}));

myTask.Start();

while (!myTask.IsCompleted)
{
    System.Threading.Thread.Sleep(1000);
}

//Continue
4

2 に答える 2

7

まず、sleep-spin を取り除きます。それは a を使用する目的を完全に無効にします。これは、完了Taskするまで UI スレッドを続行できないためです。Taskあなたはそれをしたくない !

Task myTask = Task.Factory.StartNew(
     new Action(() =>
     {
         DataSet ds;
         DataTable dt = new DataTable();    

         //GetMyDataSet() returns DataSet
         ds = GetMyDataSet();
         dt = ds.Tables["MyTableName"];

         // use Invoke/BeginInvoke to update UI
      }));

これで、タスクは完了するまで UI スレッドと並行して実行されます。Taskコードの最後でDispatcher.BeginInvoke、UI を更新するために使用します。今は大丈夫なはずです。

于 2012-06-07T12:36:15.273 に答える
-2

試す

while (!myTask.IsCompleted)
{
    Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
    System.Threading.Thread.Sleep(20);
}
于 2012-06-07T12:50:08.343 に答える