2012-01-23 2 views
0

У меня есть окно с сетчатым экраном telerik в нем, и я обновляю это gridview каждые 1 минуту. У меня есть метод обновления и каждые 1 минуту я его называю.Threading для обновления datagrid

Я не могу использовать BackgroundWorker, потому что мой CollectionViewSource находится в потоке пользовательского интерфейса, а фоновая работа не может его использовать. мой вопрос: как я могу вызвать этот метод обновления из другого потока?

где-то я вижу этот пример кода:

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

это верный путь, который я использую приведенный выше код в Refresh_Executed? , пожалуйста, помогите мне.

это мой метод Refresh:

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 Обычно я загружаю данные в виде модели с использованием асинхронных ящиков и не нуждаюсь в обновлении RadGridView. Но когда, например, мне нужно свернуть все группы e.t.c Я использую radGridView.Dispatcher.BeginInvoke (...).

UPDATE

Там нет необходимости обновлять RadGridView. Вы обновляете свойство ItemsSource. Я бы не рекомендовал использовать Dispatcher в такой ситуации, и я хотел бы использовать Task Parallel Library, чтобы получать простые данные из базы данных и обновления ItemsSource с синхронизацией с текущим потоком пользовательского интерфейса:

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()); 

Обратите внимание, что вы должны обновить этот метод для реализации ваши потребности (вы могли бы поместить ваши методы базы данных в первую задачу и могут быть возвращены Tuple из двух колекций), и это всего лишь идея.

+0

Я отправляю свой способ обновления. –

0

Использование TPL это лучший способ пойти, когда дело доходит до заправки, так как .NET 4 был выпущен ...

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

Да, с помощью Dispatcher правильный способ сделать самый светлый фон работы.

Будьте осторожны, однако, что тяжелая работа фона на Dispatcher может заблокировать пользовательский интерфейс, так как он все еще работает на основном потоке пользовательского интерфейса. Если у вас есть большое количество обработки, я бы рекомендовал использовать BackgroundWorker, Task Parallel Library, или какой-либо другой форме многопоточности (я предпочитаю await/async, однако, это доступно только в C# 5.0 или AsyncCTP Refresh)

Кроме того, Я бы рекомендовал обновить коллекцию, а DataGrid обязан вместо DataGrid. Я думаю, что обновление DataGrid приведет к повторному рисованию всех элементов пользовательского интерфейса, в то время как обновление ItemsSource будет просто повторно использовать существующие элементы пользовательского интерфейса, если это возможно.

+0

Я отправляю свой метод обновления. это ОЧЕНЬ ТЯЖЕЛАЯ работа? спасибо за Ваш ответ. –

Смежные вопросы