Как Удостовериться, что UI является Быстро реагирующим Используя BackgroundWorker

Находится BackgroundWorker в Ориентированном на многопотоковое исполнение c#?

Причина я спрашиваю это, состоит в том, потому что я получаю a

Средства управления, созданные на одном потоке, не могут быть порождены к управлению на другом потоке

исключение с ним. Это - мой DoWork код события:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{



    var openFile = document.Open(MyFileName);
    e.Result = openFile;
}

где document управление UI, которое инициализируется, когда родительская форма создается. Во время Open метод различные свойства в document будет заполнено.

Я пытался изменить код для вызова, все же та же проблема сохраняется. т.е.,

document.GetType().GetMethod("Open)".Invoke(document, new object[]{MyFileName})

приведет к той же ошибке как вышеупомянутое.

Любая идея, как управлять document управление? Другими словами, как заставить вышеупомянутый код работать?

Править: Было предложено, чтобы я использовал Control.Invoke, но это все еще не работало (оба из повешенных потоков). Это - код, который я попробовал:

private delegate bool OpenFile(string filePath);
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{



    OpenFile oF = new OpenFile(document.Open);
    var openFile = Invoke(oF, MyFileName);  // it doesn't really matter whether I use BeginInvoke or Invoke, or other Control.Invoke, the end result is the same. Both the main thread hosting the document and the thread that launches the UI hanged.

    e.Result = openFile;
}
5
задан Graviton 19 January 2010 в 02:07
поделиться

7 ответов

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

-121--4817878-

Код, опубликованный до, получает свойства, заданные текущим видом & feel, который по умолчанию является металлическим l & f.

В нем перечислены в общей сложности 636 определенных свойств в моей системе (WinXP с Java 1.6.0_17) с менее определенными свойствами в Windows L & F и Motif L & F. Я нашел другой список в Интернете ( http://www.java2s.com/Tutorial/Java/0240__Swing/ListingUIDefaultProperties.htm ), где 795 найдены.

Так что, я думаю, все еще остается вопрос: какие там свойства? Очевидно, что даже Metal L & F не устанавливает их все (или код, в результате которого получается 795, ошибочен).

Я озадачен тем, что, кажется, не существует официального списка по солнцу, который был бы тем, что я действительно ищу (а также ОП, если бы я получил вопрос правильно).

-121--2334841-

Проблема не в потоке, а в том, что он пытается вызвать метод в элементе управления пользовательского интерфейса. В WPF и WinForms элементы управления могут вызываться только в потоке пользовательского интерфейса (который обычно есть). Вы не говорите, что используете, но вам нужно вызвать метод Control.Invoke для WinForms или Dispatcher.Invoke для WPF.

Показанный метод отражения Invoke () фактически вызовет метод в текущем потоке.

5
ответ дан 14 December 2019 в 01:08
поделиться

Код, опубликованный до простого получения свойств, установленных текущим Смотрите и чувствую, что является металлом L & F по умолчанию.

Он перечисляет в общей сложности 636 определенных свойств в моей системе (WinXP с Java 1.6.0_17) с менее определенным в Windows L & F и Motif L & F. Я нашел другой список в Интернете ( http://www.java2s.com/tutorial/java/0240__swing/listingingsefaultProperties.htm ) Где 795 найдены.

Так что я думаю, что вопрос все еще остается: какие недвижимости есть там? Очевидно, что даже металлический L & F не устанавливает их все (или код, в результате чего 795 неправильно).

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

-121--2334841-

Вы можете вызвать в качестве предложенного Mehrdad Afshari, либо вы можете использовать событие прогресса BGW, которое возвращается на тему пользовательского интерфейса. Или работа завершено событие, которое также возвращается на тему UI. Разница между двумя работой охватывается только один раз в конце. Прогресс уволен вами из Dowork.

2
ответ дан 14 December 2019 в 01:08
поделиться

Возможно, вам повезет с помощью функции jQuery.grep () , а не с помощью петель.

Эта функция "Находит элементы массива, удовлетворяющие функции фильтра. Исходный массив не затрагивается. "

-121--2496236-
  • Agile Web Development перечисляет плагины (хотя и не rubygems, я не уверен, почему), и позволяет людям давать за них оценки.
  • Ruby Toolbox перечисляет драгоценные камни по категориям и сравнивает их популярность.
  • Rubygems имеет поле поиска.
  • Переполнение стека имеет вопрос о наиболее полезных плагинах рельсов и рубигемах.
-121--4780298-

Хотя мне неясно, что именно вы имеете в виду под безопасностью потока BackgroundWorker , проблема не в этом объекте; Элементы управления Windows Forms предназначены для работы с одним потоком (потоком пользовательского интерфейса). Не следует манипулировать объектами Windows Forms в различных потоках. Действия в потоке пользовательского интерфейса можно вызывать из других потоков с помощью метода Control.Invoke (используемый в настоящее время метод Invoke предоставляется путем отражения и полностью не связан с этой проблемой):

Invoke(new Action(MethodToRunInUIThread));

void MethodToRunInUIThread() {
    // do stuff here.
}

Кстати, нет смысла использовать фонового работника, если все, что вы делаете, это манипулирует объектами пользовательского интерфейса.

1
ответ дан 14 December 2019 в 01:08
поделиться

Если эта функциональность контроля интернет-пользовательского интерфейса требует, чтобы выполнить, что может быть не так много. «Замораживание» возникает, когда в потоке пользовательских интерфейсов произойдет длительная работа, и если эта функция управления не была специально сделана безопасной резьбой, она должна быть запущена на главной ните.

Обычно вы хотите отделить функциональность «документа» вдали от элемента управления, который отображает его. Таким образом, ваш документ может быть загружен на отдельный, независимый поток и отображается позже, когда готов. В противном случае сам контроль должен будет реализовать многопоточную нагрузку на медленную загрузку замораживания.

Поскольку вы указали, это третий контроль в ваших комментариях, вы, возможно, недовольны здесь.

1
ответ дан 14 December 2019 в 01:08
поделиться

Фонарный механизм - это структура на основе резьбы. Тематическая безопасность - это о функциях при одновременном задачах. Может быть, что вы спрашиваете, о том, что контролирует WinForms, которые доступны через уникальную нить, чтобы нить пользовательского интерфейса.

0
ответ дан 14 December 2019 в 01:08
поделиться

Вам нужно использовать Control.begininvoke () в доноке. Это выполняет делегат асинхронно, и поэтому гарантируют, что вызывающая нить не будет «повесить».

Control.Invoke () также выполнит делегат на другой поток также, но приведет к тому, что вызова нити будет дождаться его завершения.

Обычно в формах Windows вам лучше использовать Control.begininvoke () Везде, где это возможно, чтобы избежать тупики между потоками, которые могут возникнуть, когда один поток ждет другого, как с помощью Control.invoke ().

Если объект «Документ» наследуется от System.Windows.Forms.Control, вы можете просто вызвать документ. Begininvoke (MyDelegate).

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

Похоже, вы путаете о различных видах созваний / начинающих (понятны). Это более ранний вопрос: В чем разница между вызовом и начинающим? и Jon Skeets Ответ должен помочь уточнить вещи.

0
ответ дан 14 December 2019 в 01:08
поделиться

Минус? Обычно определение макроса не попадает в таблицу символов исполняемого файла. Немного сложнее в отладке.

-121--4223096-

Я не уверен, что ваш вопрос о Common Lisp или об алгоритме.

Существуют аналогичные проблемы (и решения) для других языков, например, Python . Python часто можно перевести в Common Lisp виртуально line-for-line, поэтому выберите один и портируйте его?: -)

-121--3080546-

@ Graviton, связанная задача с ответом находится здесь . Пользователь использовал BackgroundWorker для обновления текстового поля, применяется та же концепция (ваш только один рабочий поток).

0
ответ дан 14 December 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: