2015-04-30 2 views
0

Я пытаюсь добиться линейного кода без каких-либо «фоновых работников», работающих рядом с моей основной программой (за исключением нескольких System.Windows.Forms.Timers). Я использую Private Subs, чтобы исключить необходимость копирования и вставки, например, тех же 50 строк кода 10 раз в моей программе (что упрощает редактирование и прокрутку). Однако я столкнулся с проблемой поперечной резьбы. Как я понимаю, потому что я не доступ к свойству из потока пользовательского интерфейса, код:Использовать отдельные подсистемы, не вызывая пропорциональности

Private Sub Update() 
      DataGridView1.Rows.Clear() 
      ... 
      ... 
      ... 
End Sub 

Дает мне ошибку:

Control 'DataGridView1' accessed from a thread other than the thread it was created on.

До сих пор я использую Control.CheckForIllegalCrossThreadCalls = False в моем случае Form_Load но теперь я сталкиваюсь с некоторыми проблемами, когда таймеры не перезапускаются.

Есть ли способ заставить его работать линейно, поэтому мне не нужно каждый раз вызывать метод? Я имею около 2000 строк кода прямо сейчас, и мне было бы очень не обязательно проходить через все вызовы Button50.enabled = true и так далее.

+1

Вызов/Делегирование является правильным способом для доступа управления из рабочих потоков. Вам нужно вернуться и исправить их. – OneFineDay

ответ

0

С .Net Framework 4.0 мы смогли использовать Lambda sub для делегирования. Вы можете даже вызвать методы внутри этого Sub.

Пример:

Private Sub Update() 
    Me.Invoke(Sub() 
       'update controls or form in here - thread safe 
      End Sub) 
+0

Спасибо! Заметка для тех, кто пытается одно и то же: вам нужно «()» после первого «Sub». Поэтому используйте: «Me.Invoke (Sub()». –

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