vb.net - Silverlight中的无效跨线程异常

标签 vb.net multithreading silverlight user-interface

我有一个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/

相关文章:

vb.net - 如何在VB.NET中提取邮件正文中的img标签

c++ - 向不存在的窗口发送消息好吗?

silverlight - 如何在Silverlight 4中用NavigationService实现MVVM?

多线程环境中的 Java WS Authenticator

android - 控制标记部署。

.net - NET/银光 : Immutable objects and the DataContractSerializer

silverlight - 在 Silverlight 中使用 ItemsSource 之前,项目集合必须为空

vb.net - 如何通过索引值查找字典的键?

.net - 为什么不识别 HttpUtility 类?

c# - 如何避免在 ASP.NET MVC 中呈现导致异常的相同 View 的 HttpRequestValidationException