如何在Xamarin.Forms上在后台使用F#运行Task?

时间:2018-07-09 23:03:01

标签: android xamarin.forms f# background-process

我正在尝试在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服务器开始监听)

1 个答案:

答案 0 :(得分:0)

创建异步并将其传递给ignore并不会真正在异步内部运行代码。它创建了一个计算,该计算在启动时会执行某些操作,但不会启动它。因此,如果您想使用async,则最后三行可能是这样的:

async {
      task.Start()
} |> Async.Start

但是,您还从调用task.Wait()切换为调用task.Start(),这也应该独立地防止阻塞线程。因此,您很可能只需致电:

task.Start()

或者,如果您想在后台排队的Wait内进行阻塞async,则可以编写(但请注意,绝对没有理由这样做):

async {
      task.Wait()
} |> Async.Start