我有一个VB silverlight应用程序,它将成为纸牌游戏。我一直试图将单个卡(通过编程创建,作为Silverlight“图像”控件,包装在其自己的“CardImage”类中)在鼠标悬停时移动。我希望它们在鼠标悬停在它们上方时“弹出”,然后在鼠标离开时回落。
本质上,我将Image.Margin.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线程仍不采用正在更新图像边距的线程的任何提示?
最佳答案
“图像”是在创建CardImage的线程的上下文中创建的。如果那不是UI线程而是辅助线程,则无法从UI线程(将鼠标事件调度到该线程)访问它。
在UI线程中创建它:
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
关于vb.net - Silverlight中的无效跨线程异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9775726/