假设我有以下代码:
我想使用这个类并从C#中调用X。问题在于X返回一个Async<'T>,但是公开F#特定类型是不好的做法。所以最佳实践是返回一个Task。但是Async.StartAsTask有点问题,因为它会导致代码在单独的线程中运行。我想要的是返回一个Task,但是它也应该像Async.StartImmediate一样运行。因此,非异步部分的代码应该在原始主线程中运行。在这里,我假设我从UI线程运行它,以便所有调用都返回相同的线程ID。换句话说,我想要一个Async.StartImmediate,但返回一个任务。 这是可行的吗?
namespace Library1
open System.Threading.Tasks
open System.Threading
open System.Runtime.Remoting.Messaging
open System
type public Class1() =
let printThread (message) =
printfn "%s %A" message Thread.CurrentThread.ManagedThreadId
let bar =
printThread ("first bar")
async {
printThread ("first async")
do! Async.Sleep(1000)
printThread "last async"
}
member this.X() = bar
我想使用这个类并从C#中调用X。问题在于X返回一个Async<'T>,但是公开F#特定类型是不好的做法。所以最佳实践是返回一个Task。但是Async.StartAsTask有点问题,因为它会导致代码在单独的线程中运行。我想要的是返回一个Task,但是它也应该像Async.StartImmediate一样运行。因此,非异步部分的代码应该在原始主线程中运行。在这里,我假设我从UI线程运行它,以便所有调用都返回相同的线程ID。换句话说,我想要一个Async.StartImmediate,但返回一个任务。 这是可行的吗?