У меня была похожая проблема. Я делал Silverlight MVVM ViewModel для привязки данных из Интернета.
Дон Сайм прокомментировал себя:
Я не эксперт по связыванию данных, но я
верю, что вы не можете «спрятать» асинхронность
такой модели представления для WPF и
Silverlight. Я думаю, что вам нужно
выставить Task, Async или
наблюдаемая коллекция. AFAIK единственный
способ связать Silverlight и WPF
асинхронно к свойству, если оно
является наблюдаемой коллекцией.
В любом случае, я установил F # Power Pack, чтобы получить AsyncReadToEnd.
Это не помогло ... Я добавил домены в доверенные сайты, но это не помогло ... Затем я добавил MySolution.Web -asp.net-site и clientaccesspolicy.xml. Я не знаю, имели ли они какое-либо влияние.
Теперь, с Async.StartImmediate, я получил вызов веб-службы:
let mutable callresult = ""
//let event = new Event<string>()
//let eventvalue = event.Publish
let internal fetch (url : Uri) trigger =
let req = WebRequest.CreateHttp url
//req.CookieContainer <- new CookieContainer()
let asynccall =
async{
try
let! res = req.AsyncGetResponse()
use stream = res.GetResponseStream()
use reader = new StreamReader(stream)
let! txt = reader.AsyncReadToEnd()
//event.Trigger(txt)
callresult <- txt //I had some processing here...
trigger "" |> ignore
with
| :? System.Exception as ex ->
failwith(ex.ToString()) //just for debug
}
asynccall |> Async.StartImmediate
Теперь мне понадобится моя ViewModel для прослушивания изменяемого результата вызова.
В вашем случае вам также понадобится файл crossdomain.xml для сервера.
Триггер необходим для использования UI-потока:
let trigger _ =
let update _ = x.myViewModelProperty <- callresult
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(new Action(update)) |> ignore
fetch serviceUrl trigger