我正在尝试构建从 Silverlight (4) 到 JBOSS Web 服务器的 Rpc 调用原型。我已经编写了代码,并且它正在控制台应用程序中运行 - 所以我知道 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
这可能是一个沙箱问题,因为我的 silverlight 是从我的文件系统中提供服务的,并且 Uri 是对本地主机的引用 - 尽管我什至没有得到异常。想法?
Thx
UPDATE 1
我创建了一个新项目并移植了我的代码,现在它可以工作了;就 F# Silverlight 集成而言,某些东西肯定仍然不稳定。仍然很感激在旧模型中调试“悬挂”网络创建的想法......
UPDATE 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
我肯定错过了什么;异步块在控制台应用程序中工作正常 - Silverlight 应用程序中不允许吗?
(感谢您将其发送给 fsbugs,迫使我们仔细研究。)
问题是Async.RunSynchronously
。当在 UI 线程上调用时,这会阻塞 UI 线程。事实证明WebRequest.Create()
Silverlight 上分派到 UI 线程。所以这是一个僵局。
一般来说,尽量避免Async.RunSynchronously
在 Silverlight 上(或在任何 UI 线程上)。您可以使用Async.StartImmediate
在这个例子中。或者,我想你可以打电话RunSynchronously
从任何后台线程都没有问题。 (我自己还没有尝试足够的端到端 Silverlight 方案来提供更多建议。您可以查看
F# 游戏编程(使用 Silverlight 和 WPF) http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!1910.entry
F# 和 Silverlight http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!1854.entry
客户端的 F# 异步 http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!1842.entry
一些简短的例子。)
(回想起来,F# 设计团队认为我们也许不应该包括Async.RunSynchronously
在用于 Silverlight 的 FSharp.Core 中;该方法可能违反平台的精神(不阻塞调用)。我们可能会在未来的 Silverlight 版本中弃用该方法。另一方面,它仍然可以有效地用于 Silverlight 上的 CPU 密集型并行性,例如在后台线程上并行运行一堆(非 IO)代码。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)