Я хочу обновить DataGrid из нескольких потоков в WPF (C#). Я использую dataGrid.Dispatcher.BeginInvoke() и dataGrid.Dispatcher.Invoke(), но они замораживают программу (основной поток). Как обновить dataGrid из нескольких потоков с таймаутом (потому что я использую веб-сервис, который может быть недоступен).Обновление DataGrid из нескольких потоков
ответ
Если вы не нуждаетесь в DataGrid редактирования должно быть сделано в резьбе, вы можете запустить их в основной поток, как это:
this.Invoke((Action)delegate
{
//Edit the DataGrid however you like in here
});
Убедитесь в том, чтобы только положить вещи, которые вы потребность, чтобы быть запускать в основном потоке внутри него (в противном случае это могло бы превзойти цель многопоточности).
-> ваш ответ не содержит тайм-аута. также он бросает исключение. однако спасибо ... –
@ Babak.Abad Действительно? Что это за исключение? Потому что я использовал это, и он всегда работал. И вы установите таймаут после вызова так, чтобы он запускался в потоке, а не в основном потоке. – AlphaDelta
простите меня AlphaDelta. Вы имели в виду this.Dispatcher.Invoke (...)? –
Использовать Task
асинхронно отсылать запрос веб-службы. Для этого вам, вероятно, потребуется преобразовать стиль EAP (основанный на событиях асинхронный шаблон) в стиль TAP (асинхронный шаблон на основе задач). Вот как вы это делаете.
private Task<IEnumerable<YourDataItem>> CallWebServiceAsync()
{
var tcs = new TaskCompletionSource();
var service = new YourServiceClient();
service.SomeOperationCompleted +=
(sender, args) =>
{
if (args.Error == null)
{
tcs.SetResult(args.Result);
}
else
{
tcs.SetException(args.Error);
}
};
service.SomeOperationAsync();
return tcs.Task;
}
После того, что в месте, то вы можете использовать новые async
и await
ключевые слова, чтобы сделать звонок и ждать его возвращения, используя семантику продолжение стиля. Это будет выглядеть так.
private async void Page_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
IEnumerable<YourDataItem> data = await CallWebServiceAsync();
YourDataGrid.DataSource = data;
}
Это все! Это не выглядит намного более элегантным. Это будет выполнять операцию асинхронно на фоновом потоке, а затем привязать результаты к DataGrid
в потоке пользовательского интерфейса.
Если услуга WCF недоступна, она выдает исключение и будет прикреплена к Task
так, чтобы она распространялась до вызова await
. В этот момент он будет введен в исполнение и может быть завернут с помощью try-catch
, если это необходимо.
- 1. Обновление глобального Dict из нескольких потоков
- 2. Java Swing - обновление вида из нескольких потоков
- 3. Обновление максимального значения из нескольких потоков
- 4. Обновление одного значения из нескольких потоков
- 5. C# Обновление TextBox из нескольких потоков
- 6. Обновление DataGrid для нескольких таблиц
- 7. Обновление от нескольких потоков того же класса
- 8. Наполнение карты из нескольких потоков
- 9. pthread_cond_signal из нескольких потоков
- 10. Обновление командной строки printf информации из нескольких потоков
- 11. C#: обновление Консоль в текстовом поле из нескольких потоков
- 12. Обновление пользовательского интерфейса из нескольких рабочих потоков (.NET)
- 13. Обновление/удаление данных из Datagrid
- 14. Обновление DataGrid
- 15. чтение нескольких файлов из нескольких потоков
- 16. Заполнение списка из нескольких потоков
- 17. объясняет вывод из нескольких потоков
- 18. Python, выходящий из нескольких потоков
- 19. Ждите одного из нескольких потоков
- 20. Один XElement из нескольких потоков
- 21. Протокол Python из нескольких потоков
- 22. COM-вызовы из нескольких потоков
- 23. Ожидание задания из нескольких потоков
- 24. Вызов принять() из нескольких потоков
- 25. Доступ массив из нескольких потоков
- 26. getResourceAsStream из нескольких потоков безопасен?
- 27. написать TraceListener из нескольких потоков
- 28. Хранение данных из нескольких потоков
- 29. Вызов java.util.Collections.shuffle() из нескольких потоков?
- 30. Создание каталога из нескольких потоков
Я предполагаю, что вы выполняете вызов веб-службы внутри метода, который вызывается диспетчером. Это, конечно же, заморозит пользовательский интерфейс. Вызовите веб-службу из фонового потока (* перед вызовом 'Invoke') и передайте результат в поток пользовательского интерфейса' Invoke'. – Clemens
Привет Клеменс. Можно ли показать мне пример? Я новичок в многопоточности. –