1

私はいくつかのデータを持っており、タスクでそれを更新します。アプリは現時点ではアイデアのハックであるため、コードについてはお詫びします。

Task.Factory.StartNew(() =>
    {
        dataGridView1.BeginInvoke((Action)(() =>
            {
                dataGridView1.SuspendLayout();
            }));

        dataSet1.Reset();
        da.Fill(dataSet1);

        dataGridView1.BeginInvoke((Action)(() =>
            {
                dataGridView1.DataSource = dataSet1.Tables[0];
                dataGridView1.Columns[0].Visible = false;
                dataGridView1.Columns[1].Width = 50;
                dataGridView1.ResumeLayout();
            }));
    }
    ).ContinueWith(task =>
        {
            if (dataSet1.Tables[0].Rows.Count > 0)
            {
                if (lastcount != dataSet1.Tables[0].Rows.Count)
                {
                    lastcount = dataSet1.Tables[0].Rows.Count;
                    if (lastcount == 0)
                    {
                        NotifyWithMessage("The items have been cleared", "Items cleared");
                    }
                    else
                    {
                        NotifyWithMessage(String.Format("There are {0} new items in your monitor", dataSet1.Tables[0].Rows.Count));
                    }
                }
            }
        }
    );

これで、コードは基本的に機能します。エラーはありません。これは素晴らしいことです。

タスクの外で更新されたとき、datavgridview のフラッシュはまったくありませんでした。デバッグで実行すると、それは非常にマイナーであり、ハッキングの許容範囲内です..デバッグの外で実行した瞬間...それは非常に明白です! 一時停止と再開のレイアウトは、まったく違いはありません。UI がなくてもゴツゴツ反応するため、スレッドにコードが必要ですが、それは許容できますが、現在はリフレッシュが悪いです。

私の Datagridview は、セルの色に応じてカスタム色付けされていますが、デバッグとリリースに違いがある理由がわかりません。逆のパフォーマンスが期待できます!

(私は Invoke と BeginInvoke を試しました...)

2 つの画面のうちの 1 つで DataGridView の恐ろしい再描画パフォーマンスを見ました

そして、デバッグ中、これは少しもちらつきません...リリース状態では、ばかげたちらつきがあります...

私に何ができる?

4

2 に答える 2

2

バックグラウンドでデータセットを埋めるタスクを開始し、このタスクが完了したら、BeginInvoke を実行します。ここで、レイアウトを一時停止し、データを割り当てて再開します。

現在お使いのバージョンでは、コード パスが実行されるタイミングが非常に多く、何が起こるかを予測するのは困難です。

レンダリングは UI スレッド上で行う必要があるため、できることはコードを最適化することだけです。そして、投稿の冒頭で説明したように、私が行う非同期部分。

于 2012-06-22T12:45:54.903 に答える
1

最後に、私がしたことは次のとおりです。カウントが同じであれば、クエリを新しいデータセットに変換し、カウントが変更された場合はグリッドを更新しませんでした。

timer1.Stop();

        Task<Boolean>.Factory.StartNew(() =>
            {
                DataSet t = new DataSet();
                //_dataSet1.Reset();
                Boolean ok = false;
                Int16 retries = 0;
                while (!ok && retries<3)
                try
                {
                    da.Fill(t);
                    ok = true;
                }
                catch
                {
                    retries++;
                    Thread.Sleep(1000);
                }
                //if (!ok) throw new Exception("DB error");
                if (!ok) return false;
                try
                {
                    if (t.Tables.Count > 0 && t.Tables[0].Rows.Count != _lastcount)
                    {
                        _dataSet1 = t;
                        _lastcount = t.Tables[0].Rows.Count;
                        return true;
                    }
                }
                catch {  }
                return false;
            }).ContinueWith(task =>
                {
                    if (task.IsFaulted)
                    {
                        SQLFailed();
                        return;
                    }
                    if (!task.Result) return;


                    Invoke((Action) (() =>
                                         {
                                             dataGridView1.DataSource = _dataSet1.Tables[0];
                                             dataGridView1.Columns[0].Visible = false;
                                             dataGridView1.Columns[1].Width = 50;
                                         }));

                    if (_lastcount == 0)
                    {
                        NotifyWithMessage("The items have been cleared", "Items cleared");
                    }
                    else
                    {
                        NotifyWithMessage(String.Format("There are {0} new items in your monitor", _lastcount));
                    }
                });


    timer1.Start();
于 2012-09-19T13:47:27.647 に答える