2014-11-01 73 views
0

我在Silverlight中實現WCF。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 

服務在哪裏.serviceclient是WCF代理變量s

已完成的事件處理程序需要用來獲取返回值。

執行代碼後,我得到``無效的跨線程訪問。'在 MessageBox.Show(e.Result)異常

我的問題是類似link available at StackOverflow

但我不明白Ken2k先生說。

請指導並幫助我解決問題。

回答

0

用調度器包裝MessageBox.Show()Dispatcher.BeginInvoke(MessageBox.Show("BLAH")服務必須在與UI線程不同的線程上返回,這就是爲什麼你會得到異常。

0

明白了...

我需要提供busyindicator.isbusy =在完成功能錯誤。

一起刪除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可以被視爲封閉的問題。