2016-11-22 6 views
3

私は現在、仕事を使用してDataGridViewを記入しています。最初は、dataTableと入力しても問題ありませんが、UIスレッドを続行すると、フォームが短期間応答しなくなります。フォームを使わないでデータグリッドビューを塗りつぶすにはどうすればいいですか?

このような不具合を避けるにはどうすればよいですか?

if (bar == null) 
{ 
    bar = CNPR.Controls.Helper.GetWaitingBar(this); 
    this.Controls.Add(bar); 
} 
bar.Visible = true; 
bar.BringToFront(); 
bar.StartWaiting(); 
panel1.Enabled = false; 
rasteTableBindingSource.DataSource = null; 
var t = Task.Factory.StartNew(() => rasteTableTableAdapter.FillBySearch(chapYarDataSet.rasteTable)) 
    .ContinueWith(delegate 
    { 
     bar.StopWaiting(); 
     bar.Visible = false; 
     panel1.Enabled = true; 
     rasteTableBindingSource.DataMember = chapYarDataSet.rasteTable.TableName; 
     rasteTableBindingSource.DataSource = chapYarDataSet; 
    }, TaskScheduler.FromCurrentSynchronizationContext()); 

答えて

0

StartNewメソッドを現在の同期コンテキストで使用しているため、スレッドプールではなくuiで実行されています。コードの理解を深めるために、@StephenCleary StartNew is Dangerousの記事を読むべきです。

あなたはRunメソッドを使用して、バックグラウンドで行われるべきデータ検索のためのあなたのロジックを分割し、UIコンテキストでデータソースを記入する必要があります

var t = Task.Run(() => rasteTableTableAdapter.FillBySearch(chapYarDataSet.rasteTable)) 
    .ContinueWith(delegate { /* UI logic here */ }, 
     TaskScheduler.FromCurrentSynchronizationContext()); 

更新:あなたは使用している場合

Task.Factory.StartNew({ /* Action here */ }, 
    CancellationToken.None, 
    TaskCreationOptions.None, 
    TaskScheduler.Default); 

もう一つの大きな記事では、私は、残念ながらTask.Run vs Task.Factory.StartNew

+0

です:.NET 4.0とRun方法を使用することはできませんが、このオーバーロードを使用します私は.net 4を使っています:((。 NET 4のための別の解決策はありますか? –

+0

記事を読んだことがありますか?そこに解決策があります。答えを更新しました。 – VMAtm

+0

'TaskCreationOptions'には、.net 4の' DenyChildAttach'というメンバーはありません((。 –

関連する問題