Потоки: вызов делегата из отдельного потока (VS2010) - PullRequest
0 голосов
/ 11 июня 2011

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

Итак, я не могу использовать метод Invoke.Есть ли способ вызвать функцию из другого потока?

Ответы [ 2 ]

0 голосов
/ 11 июня 2011

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

Один из способов сделать это состоит в том, чтобы ваш класс принял экземпляр ISynchronizeInvoke.Экземпляры Form и Control реализуют этот интерфейс, поэтому можно использовать ссылку на один из них.Можно заключить соглашение, что если экземпляр не указан, то обработчики событий, выполняемые путем вызова событий в вашем классе, будут выполняться в рабочем потоке вместо потока, в котором размещается экземпляр ISynchronizeInvoke (обычно это форма или элемент управления).*

Public Class YourClass
  Private m_SynchronizingObject As ISynchronizeInvoke = Nothing

  Public Sub New(ByVal synchronizingObject As ISynchronizeInvoke)
    m_SynchronizingObject = synchronizingObject
  End Sub

  Public Property SynchronizingObject As ISynchronizeInvoke
    Get
      Return m_SynchronizingObject
    End Get
    Set(ByVal value As ISynchronizeInvoke)
      m_SynchronizingObject = value
    End Set
  End Property

  Private Sub SomeMethodExecutingOnWorkerThread()
    RaiseSomeEvent()
  End

  Private Sub RaiseSomeEvent()
    If Not SychronizingObject Is Nothing AndAlso SynchronizingObject.InvokeRequired Then
      SynchronizingObject.Invoke(New MethodInvoker(AddressOf RaiseSomeEvent)
    End If
    RaiseEvent SomeEvent
  End Sub

End Class

Первое, на что нужно обратить внимание, это то, что вам не нужно указывать синхронизирующий объект.Это означает, что вам не нужно иметь ссылку Form или Control.Если он не указан, то SomeEvent будет вызван в рабочем потоке.Это тот же шаблон, который используется в классе System.Timers.Timer.

0 голосов
/ 11 июня 2011

Попытайтесь выставить некоторые события в вашем классе, запустить их, когда вам нужно будет уведомить ваш пользовательский интерфейс, и, наконец, заставить ваш компонент пользовательского интерфейса регистрироваться на эти события когда событие вызывается, методы слушателя будут выполнены. там вы можете использовать Control.Invoke или Control.BeginInvoke для выполнения вашего кода в потоке пользовательского интерфейса.

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