Silverlight中的跨线程异常无效

时间:2012-03-19 18:25:09

标签: vb.net multithreading silverlight user-interface

我有一个VB silverlight应用程序,它将成为纸牌游戏。我一直在尝试获取单个卡片(我以编程方式创建,作为Silverlight“图像”控件,包装在他们自己的“CardImage”类中)以便在鼠标移动时移动。我希望它们在鼠标悬停时“弹出”,然后在鼠标离开时向下拉。

基本上,我正在将Image.Margin.Top移动到mouseenter上5个像素,并在mouseleave事件上移动5个像素。

我一直在经历关于无效的跨线程访问的可怕的“未处理的异常”,并且完成了我的作业,我已经了解了UI线程与工作线程等,并试图将整个“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张牌的“手牌”),抛出异常。请记住,玩家最终可能会做这类事情......而且我真的不希望应用程序崩溃,因为一些有ADHD的用户决定他们想让卡片一遍又一遍地“波浪”,在不耐烦地等待其他人玩牌时。

有关为什么我的UI线程仍未采用更新图像边距的线程的任何提示?

1 个答案:

答案 0 :(得分:0)

'Image'是在创建CardImage的线程的上下文中创建的。如果那不是UI-Thread而是工作线程,则无法从UI-Thread(到您调度鼠标事件的位置)访问它。

在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