J.K*_*K.J 10 silverlight f# asynchronous httpwebrequest silverlight-4.0
我正在尝试从Silverlight(4)将Rpc调用原型化为JBOSS网络服务器.我编写了代码,它正在一个控制台应用程序中工作 - 所以我知道Jboss正在响应Web请求.将它移植到silverlight 4,会导致问题:
let uri = new Uri(queryUrl)
// this is the line that hangs
let request : HttpWebRequest = downcast WebRequest.Create(uri)
request.Method <- httpMethod;
request.ContentType <- contentType
Run Code Online (Sandbox Code Playgroud)
它可能是一个沙盒问题,因为我的Silverlight是从我的文件系统提供的,而Uri是对本地主机的引用 - 尽管我甚至没有得到例外.思考?
谢谢
更新1
我创建了一个新项目并移植了我的代码,现在它正在工作; 关于F#Silverlight集成的东西必须是不稳定的.仍然会欣赏有关在旧模型中调试"悬挂"网页的想法...
更新2
let uri = Uri("http://localhost./portal/main?isSecure=IbongAdarnaNiFranciscoBalagtas")
// this WebRequest.Create works fine
let req : HttpWebRequest = downcast WebRequest.Create(uri)
let Login = async {
let uri = new Uri("http://localhost/portal/main?isSecure=IbongAdarnaNiFranciscoBalagtas")
// code hangs on this WebRequest.Create
let request : HttpWebRequest = downcast WebRequest.Create(uri)
return request
}
Login |> Async.RunSynchronously
Run Code Online (Sandbox Code Playgroud)
我肯定错过了什么; Async块在控制台应用程序中运行良好 - Silverlight应用程序中是不允许的?
(感谢您将此信息发送给fsbugs,迫使我们严格审视.)
问题是Async.RunSynchronously.在UI线程上调用时,这将阻止UI线程.事实证明,WebRequest.Create()在Silverlight上调度到UI线程.所以这是一个僵局.
通常,尽量避免Async.RunSynchronously使用Silverlight(或任何UI线程).您可以Async.StartImmediate在此示例中使用.或者,我认为您可以RunSynchronously从任何后台线程调用而不会出现问题.(我还没有尝试过足够的端到端Silverlight场景来提供更多建议.你可以查看
举几个简短的例子.)
(回想起来,F#设计团队认为我们可能不应该包含Async.RunSynchronously在Silverlight的FSharp.Core中;该方法可能违反平台的精神(没有阻塞调用).我们可能会在将来的Silverlight版本中弃用该方法另一方面,它仍然在Silverlight上具有CPU密集型并行性的有效用途,例如在后台线程上并行运行(非IO)代码.)