簡體   English   中英

F#:在異步返回之前的SwitchToThreadPool的目的

[英]F#: purpose of SwitchToThreadPool just before async return

Async.SwitchToNewThread的MS文檔中,給出的示例之一是:

let asyncMethod f = 
    async {  
        do! Async.SwitchToNewThread() 
        let result = f() 
        do! Async.SwitchToThreadPool() 
        return result
    } 

在return語句之前立即切換到線程池的目的是什么? 我理解為什么你可能想要在異步塊有更多工作要做的時候從專用線程切換到線程池,但事實並非如此。

這不是主要問題的一部分,但我也很想知道為什么SwitchToNewThread和SwitchToThreadPool返回Async。 有沒有一個用例,你不想立即“做!” 這些任務? 謝謝

這個例子可能更清晰,因為它沒有展示任何真實場景。

但是,有一個很好的理由在return之前切換到另一個線程。 原因是調用函數的工作流(例如asyncMethod )將繼續在返回之前切換到的上下文/線程中運行。 例如,如果你寫:

Async.Start (async {
  // Starts running on some thread (depends on how it is started - 'Async.Start' uses
  // thread pool and 'Async.StartImmediate' uses the current thread
  do! asyncMethod (fun () -> 
      Thread.Sleep(1000) ) // Blocks a newly created thread for 1 sec
  // Continues running on the thread pool thread 
  Thread.Sleep(1000) }) // Blocks thread pool thread

我認為示例中使用的模式不太正確 - 異步工作流應始終返回到啟動它們的SynchronizationContext (例如,如果工作流在GUI線程上啟動,它可以切換到新線程,但應該返回GUI線程)。 如果我正在編寫asyncMethod函數,我會使用:

let asyncMethod f = async {  
    let original = System.Threading.SynchronizationContext.Current
    do! Async.SwitchToNewThread() 
    let result = f() 
    do! Async.SwitchToContext(original)
    return result } 

回答你的第二個問題 - SwitchTo操作返回Async<unit>並需要使用do!調用的原因do! 是沒有辦法直接切換到不同的線程。 作為一個函數(可以在新線程上執行)獲得剩余工作流程的唯一要點就是當你使用do! 或者let! Async<T>類型本質上只是一個獲取函數的對象(工作流的其余部分)並且可以在任何需要的地方執行它,但是沒有其他方法可以“破壞”工作流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM