Silverlight WCF - 带有忙指示符的无效交叉线程异常

时间:2014-11-01 09:53:09

标签: vb.net wcf silverlight

我正在Silverlight中实现WCF。

在Silverlight中调用WCF服务时,我想展示一下BusyIndi​​cator'给用户。

我遇到了这个link实施的busyindicator。

这是在C#中。我正在vb.net开发项目。

无法正确将其转换为vb.net

busyIndicator.IsBusy = true;
//busyIndicator.BusyContent = "Fetching Data...";

ThreadPool.QueueUserWorkItem((state) =>
{
Thread.Sleep(3 * 1000);
Dispatcher.BeginInvoke(() => busyIndicator.IsBusy = false);
}

在我的要求中实现上述代码

VB.Net中的代码如下:

busyIndicator.IsBusy = True
ThreadPool.QueueUserWorkItem(Sub(state)

      Dim s As New services.ServiceClient

      AddHandler s.confirmticketCompleted, AddressOf mcompleted
          s.confirmticketAsync()
           Dispatcher.BeginInvoke(Sub()
       busyIndicator.IsBusy = False     
                    End Sub)
                    End Sub)



Sub mcompleted(sender As System.Object, e As services.confirmticketCompletedEventArgs)

        MessageBox.Show(e.Result)

    End Sub

其中services.serviceclient是带变量s的WCF代理

需要使用已完成的事件处理程序来获取返回值。

实施代码后,我得到了“无效的跨线程访问权限”。例外 MessageBox.Show(e.Result)

我的问题类似于link available at StackOverflow

但我无法理解Ken2k先生所说的话。

请指导并帮助我解决问题。

2 个答案:

答案 0 :(得分:0)

使用调度程序MessageBox.Show()包装Dispatcher.BeginInvoke(MessageBox.Show("BLAH")服务必须在与UI线程不同的线程上返回,这就是您获得异常的原因。

答案 1 :(得分:0)

知道了......

我需要在已完成的功能中提供busyindicator.isbusy = false。

完全删除ThreadPool.QueueUserWorkItem和Dispatcher.BeginInvoke。

最终代码如下:

    busyIndicator.IsBusy = True

        Dim s As New services.ServiceClient
        AddHandler s.confirmticketCompleted, AddressOf mcompleted
        s.confirmticketAsync()



Sub mcompleted(sender As System.Object, e As services.confirmticketCompletedEventArgs)

        Dim k As String = e.Result


        MessageBox.Show(k)


        busyIndicator.IsBusy = False

    End Sub

我非常感谢ken2k。 stackoverflow的链接是link

Thanq可视为封闭式问题。