我正在尝试在android xamarin.forms应用程序内使用http服务器。它需要翻译以下C#代码:
var server = WebServer
.Create(url)
.EnableCors()
.WithLocalSession()
.WithStaticFolderAt("c:/web");
var cts = new CancellationTokenSource();
var task = server.RunAsync(cts.Token);
Console.ReadKey(true);
cts.Cancel();
try
{
task.Wait();
} catch (AggregateException)
{
// We'd also actually verify the exception cause was that the task
// was cancelled.
server.Dispose();
}
现在,问题在于task.Wait()
会阻止Android应用程序,使其无法响应。
现在,我尝试将任务放入表单应用程序中:
type App() =
inherit Application()
let mutable task:System.Threading.Tasks.Task = null
do
let t, form = mainWebForm()
task <- t
base.MainPage <- form
async {
task.Start()
} |> ignore
但是在Android上不起作用。但是,在iOS中它可以正常运行(即:Web服务器开始监听)
答案 0 :(得分:0)
创建异步并将其传递给ignore
并不会真正在异步内部运行代码。它创建了一个计算,该计算在启动时会执行某些操作,但不会启动它。因此,如果您想使用async
,则最后三行可能是这样的:
async {
task.Start()
} |> Async.Start
但是,您还从调用task.Wait()
切换为调用task.Start()
,这也应该独立地防止阻塞线程。因此,您很可能只需致电:
task.Start()
或者,如果您想在后台排队的Wait
内进行阻塞async
,则可以编写(但请注意,绝对没有理由这样做):
async {
task.Wait()
} |> Async.Start