【问题标题】:what is the best way to get notified when a task finishes, in F#?在 F# 中,当任务完成时获得通知的最佳方式是什么?
【发布时间】:2021-02-05 22:34:00
【问题描述】:

我有一个任务池,我正在尝试找出在一个事件完成时通过事件获得通知的最佳方式。

由于任务种类繁多,我不想在任务本身中添加一段代码,因为这意味着将它放在多个地方。这些是长期运行的任务,我不会等待他们在任何地方完成,他们只是开始,完成他们的工作(几分钟到几天)然后他们完成。

丑陋但可行的解决方案是将每个工作任务包装成另一个任务,等待工作任务完成然后发送一个事件,但我希望会有更优雅的东西。

【问题讨论】:

  • “任务”是什么意思?这是指System.Threading.Tasks.Task 还是其他任务的表示?
  • 如果是System.Threading.Tasks.Task,那么你可以使用System.Threading.Task.WhenAny静态方法。它将返回任务,当任何任务完成时都会完成
  • @TomasPetricek 是的,我说的是 threading.tasks
  • @JL0PD,回到创建一个任务来监控另一个任务;我想知道一个事件是否可以在任务完成时附加到任务本身。

标签: events f# task


【解决方案1】:

在评论中你解释说你是这样开始你的任务的:

Async.StartAsTask (runner.Start(), TaskCreationOptions.LongRunning, cancellationSource.Token)

不要这样做,而是像这样开始它们:

startMyTask runner cancellationSource (fun() -> printfn "Task completed!")

地点:

let startMyTask (runner: RunnerType) (s: CancellationTokenSource) onDone = 
    let wrapper = async { 
      do! runner.Start()
      onDone() 
    }
    Async.StartAsTask (wrapper, TaskCreationOptions.LongRunning, s.Token)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多