делегаты после переноса проекта .Net 1.1 в 3.5 - PullRequest
0 голосов
/ 12 февраля 2009

Я перенес устаревший проект .Net .Net из .Net 1.1 в .Net 3.5, и когда я пытаюсь его запустить, я получаю следующую ошибку:

Операция с поперечной резьбой недопустима: Элемент управления grpLogin доступен из нить, кроме нити это было создан на.

Когда поток (который я предполагаю, не является потоком пользовательского интерфейса) меняет свойство enabled кнопки на true.

Я считаю, что что-то изменилось в фреймворке, чтобы добавить это ограничение, есть ли способ заставить это работать без капитального ремонта всего приложения?

Можно ли заставить VS (я использую VS 2008) запускать приложение как .Net 1.1 (я даже не уверен, что это проблема)

Приложение является просто тестовым приложением для API, который мне сказали перепроектировать, поэтому у меня нет достаточной пропускной способности, чтобы решить все его проблемы. Я знаю, что это работало ранее, но у меня не установлена ​​старая версия VS, поэтому мне пришлось преобразовать ее в VS 2008.

Ответы [ 2 ]

1 голос
/ 12 февраля 2009

Исправлено не использование анонимных методов: это просто использование Control.Invoke или Control.BeginInvoke некоторым некоторым способом. Неважно, является ли это анонимным методом, делегатом, созданным из группы методов или лямбда-выражением - дело в том, что вам нужно выполнить маршалинг в поток пользовательского интерфейса. См. мою статью о потоке для более подробной информации. Вы также можете рассмотреть возможность использования BackgroundWorker , чтобы упростить его. (Моя статья была написана до .NET 2.0, поэтому в ней отсутствуют ссылки на BackgroundWorker.)

Кстати, это уже была ошибка в вашем коде 1.1 - это не новое ограничение в .NET 2.0, просто .NET 2.0 добавила проверку (выбрасывая исключение, которое вы видели) при запуске в режим отладки.

0 голосов
/ 12 февраля 2009

найдено исправление здесь решение состоит в использовании анонимных делегатов:

 // running on worker thread...
  string newText = LongRunningOperation();

  //switch to UI thread
  this.Invoke((MethodInvoker)delegate {
    // this bit runs on the UI thread
    this.Text = newText;
  });

Очевидно, замените "this.Text" любым кодом, который вы хотите запустить в потоке пользовательского интерфейса, это работает.

Все еще интересует способ запуска .Net 1.1 под VS 2008. Я слышал, что в нем можно запустить несколько версий F / Work, просто не знаю как.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...