我正在Silverlight中实现WCF。
在Silverlight中调用WCF服务时,我想展示一下BusyIndicator'给用户。
我遇到了这个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先生所说的话。
请指导并帮助我解决问题。
答案 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可视为封闭式问题。