Просто чтобы немного упростить решение от Ankur - вам не нужно использовать lazy
значения в этом случае. Самый простой способ - сначала объявить функцию computeFibonacci
, а затем вызвать ее из события DoWork
.
Важный момент, который вам нужно изменить computeFibonacci
, чтобы вернуть результат вместо сохранения его в args
, потому что args
доступны только при вызове из DoWork
:
let numIterations = 1000
let rec computeFibonacci resPrevPrev resPrev i =
//compute next result
let res = resPrevPrev + resPrev
//at the end of the computation and write the result into the mutable state
if i = numIterations then
// Return result from the function
res
else
//compute the next result
computeFibonacci resPrev res (i+1)
Затем вы можете создать фонового работника, который вызывает compueFibonacci
и сохраняет результат в args
:
let worker = new BackgroundWorker()
worker.DoWork.Add(fun args ->
// Call fibonacci and store the result in `Result`
// (the F# compiler converts number to `obj` automatically)
args.Result <- computeFibonacci 1 1 2)
worker.RunWorkerCompleted.Add(fun args ->
MessageBox.Show(sprintf "result = %A" args.Result) |> ignore)
worker.RunWorkerAsync()