消費F#異步假設我有以下代碼:從C#
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返回異步<'T>。但是,暴露F#特定類型是不好的做法。所以最好的做法是返回一個任務。然而,Async.StartAsTask是有問題的,因爲它會導致代碼在單獨的線程中運行。我想要的是我想返回一個任務,但它也應該像Async.StartImmediate一樣行事。因此代碼的非異步部分應該在原始主線程中運行。 這裏我假設我從UI線程運行它,以便所有調用都將返回相同的線程ID。換句話說,我想要一個Async.StartImmediate,但返回一個任務。 這是可以實現的嗎?
以下如果我運行這個,我得到這樣的輸出:'X 8,第一個條8,第一個異步8,最後一個異步11',就像在我的(更簡單)的答案。 –
哦,是的,抱歉,您可能正在嘗試從控制檯應用程序,而等待主線程。我從UI線程運行我的代碼,並且所有打印語句都返回相同的ID。你的代碼有調用RunSynchronously的問題。它會創建一個死鎖或在另一個線程中運行last語句 –
+1如果我正確閱讀該問題,這就是我所寫的內容! –