Неверное исключение перекрестной нити в Silverlight - PullRequest
2 голосов
/ 19 марта 2012

У меня есть приложение VB silverlight, которое станет карточной игрой.Я пытался заставить отдельные карты (которые я создаю программно, как элементы управления «Изображение» Silverlight, обернутые в их собственный класс «CardImage») перемещать при наведении.Я хочу, чтобы они как бы «всплыли», когда мышь над ними, а затем снова опустились, когда мышь уходит.

По сути, я перемещаю Image.Margin.Высок на 5 пикселей при наведении мыши,и на 5 пикселей меньше при событиях отпускания мыши.

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

Вот проблема: исключение все еще происходит.

Вот мой код:

Public Class CardImage

Public Disp As Dispatcher = Deployment.Current.Dispatcher
Public WithEvents Image As New Image

Private Sub MouseEnter(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Image.MouseEnter
    Try
        Invoke(Sub() Image.Margin = New Thickness(Image.Margin.Left, Image.Margin.Top - 5, 0, 0))
    Catch ex As Exception

    End Try
End Sub
Private Sub MouseLeave(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Image.MouseLeave
    Try
        Invoke(Sub() Image.Margin = New Thickness(Image.Margin.Left, Image.Margin.Top + 5, 0, 0))
    Catch ex As Exception

    End Try
End Sub

Private Sub Invoke(ByVal act As Action)
    If Disp.CheckAccess Then
        act.Invoke()
    Else
        Disp.BeginInvoke(act)
    End If
End Sub
End Class

Исключение выдается, когда я ОЧЕНЬ быстро двигаю мышь по всем отображаемым картам (как «рука» из 13 карт по ширине).Пожалуйста, имейте в виду, что игроки могут в конечном итоге делать такие вещи ... и я действительно не хочу, чтобы приложение рухнуло, потому что какой-то пользователь с СДВГ решает, что он хочет, чтобы карты пульсировали и "делали волну" снова и снова,с нетерпением ожидая, пока другие люди начнут разыгрывать свои карты.

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

1 Ответ

0 голосов
/ 08 сентября 2012

'Изображение' создается в контексте потока, который создает CardImage. Если это не UI-поток, а рабочий поток, вы не можете получить к нему доступ из UI-потока (туда, куда вы отправили события мыши.

Создайте его в UI-Thread:

Public WithEvents Image As Image

Public Sub New()

   Image = Invoke(Function()
                       return New Image
                  End Function)

End Sub

Private Function Invoke(ByVal procedure As Func(of System.Windows.Controls))

    If Disp.CheckAccess Then
       return procedure.Invoke()
    Else
        return Disp.Invoke(procedure)
    End If

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