2012-01-23 17 views
0

私はそれにtelerik gridviewを持つウィンドウを持っており、このグリッドビューを1分ごとに更新します。私はリフレッシュ方法を持っていて、1分ごとにそれを呼びます。DataGridを更新するためのスレッディング

私のCollectionViewSourceはUIスレッドにあり、バックグラウンドワーカーは使用できないため、BackgroundWorkerを使用できません。私の質問は、私は別のスレッドからこのリフレッシュメソッドを呼び出すことができますか?

どこかに私は、このサンプルコードを参照してください。

Application.Current.Dispatcher.BeginInvoke(new Action(() => this.Refresh())); 

は、これは私がRefresh_Executedに上記のコードを使用して、真の方法ですか? 私を助けてください。

これは私の最新の情報に更新する方法です。

public ObservableCollection<RequestView> AllRequestsData { get; set; } 

private void Refresh() 
    { 
     using (ArchiveEntities db = new ArchiveEntities()) 
     { 
      var data = db.RequestSyncs.Where(x => x.UserId == null); 
      if (data.Any()) 
      { 
       string IdList = String.Join(",", data.Where(x => x.IsNew).Select(x => x.RequestId)); 
       if (!String.IsNullOrWhiteSpace(IdList)) 
       { 
        foreach (var item in db.RequestViews.Where("it.id in {" + IdList + "}")) 
        { 
         this.AllRequestsData.Add(item); 
        } 
       } 

       foreach (var item in data.Where(x => x.IsDeleted)) 
       { 
        RequestView rv = this.AllRequestsData.Where(x => x.Id == item.RequestId).SingleOrDefault(); 
        if (rv != null) 
        { 
         this.AllRequestsData.Remove(rv); 
        } 
       } 

       foreach (var item in data) 
       { 
        db.RequestSyncs.DeleteObject(item); 
       } 

       db.SaveChanges(); 
      } 
     } 
    } 

おかげ

答えて

1

共通であってもよく、それは本当の方法ですが、それは、Refresh方法の内容によって異なりますが、それのコンテンツを提供するだろうか?

EDIT 通常、非同期theadsを使用してビューモデルにデータをロードし、RadGridViewを更新する必要はありません。しかし、例えば、私がradGridView.Dispatcher.BeginInvoke(...)を使用するすべてのグループe.t.cを折り畳む必要があるとき。

UPDATE

RadGridViewを更新する必要はありません。更新中です。ItemsSourceプロパティです。私はこのような状況でDispatcherを使用しreccomendないだろうと私は、データベースからプレーンのデータを受け取ると、現在のUIスレッドと同期してItemsSourceを更新するためにTask Parallel Libraryを使用します。あなたが実装するために、このメソッドをアップグレードする必要があることを

Task.Factory.StartNew<IEnumerable<RequestSyncPlain>>(() => 
{ 
    return result; 
}).ContinueWith(_ => 
{ 
    try 
    { 
    _.Wait(); 
    } 
    catch (AggregateException ae) 
    { 
    } 

    foreach (var requestSyncPlain in _.Result) 
    { 
    var requestSync = new RequestSyncViewModel(requestSyncPlain); 

    requestSyncObservableCollection.Add(requestSync); 
    } 
}, TaskScheduler.FromCurrentSynchronizationContext()); 

注意、あなたのニーズ(データベースメソッドを最初のタスクに入れて、2回のcolelctionsからTupleを返すかもしれません)これは単なるアイデアです。 TPLを使用して

+0

私はリフレッシュ方法を投稿します。 –

0

が、それは、.NET 4がリリースされましたので、スレッドに来るとき行くための最良の方法です...

using System.Threading.Tasks; 
Task.Factory.StartNew(() => this.Refresh()) 
2

はい、Dispatcherを使用すると、最も明るい背景の作業を行うための正しい方法です。

しかし、Dispatcherで行われた大量のバックグラウンド作業は、メインのUIスレッドで実行されているため、UIをロックする可能性があることに注意してください。あなたは私がBackgroundWorkerTask Parallel Library、またはマルチスレッドのいくつかの他のフォーム使用することをお勧めします大量の処理がある場合、また

(私はawait/asyncを好むが、しかしそれは、C#5.0またはAsyncCTP Refreshでのみ利用可能です) DataGridの代わりに、DataGridがバインドされているコレクションをリフレッシュすることをお勧めします。可能であれば、ItemsSourceをリフレッシュするだけで、既存のUI要素を単純に再利用しながら、DataGridをリフレッシュするとすべてのUI要素が再描画されると思います。

+0

私のRefreshメソッドを投稿します。それは非常に重労働ですか?ご回答有難うございます。 –

関連する問題