Math.NET Numerics
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

52 lines
2.0 KiB

// (c) Microsoft Corporation 2005-2009.
namespace Microsoft.FSharp.Control
open System
open System.Threading
open System.IO
open Microsoft.FSharp.Control
open Microsoft.FSharp.Collections
#if FX_NO_SYNC_CONTEXT
#else
type AsyncWorker<'T>(p,?asyncGroup) =
let syncContext = SynchronizationContext.Current
do match syncContext with
| null -> failwith "Failed to capture the synchronization context of the calling thread. The System.Threading.SynchronizationContext.Current of the calling thread is null"
| _ -> ()
let post (syncContext : SynchronizationContext) trigger args =
syncContext.Post(SendOrPostCallback(fun _ -> trigger args),state=null)
// Trigger one of the following events when the iteration completes.
let triggerCompleted,completed = Event.create<'T>()
let triggerError ,error = Event.create()
let triggerCanceled,canceled = Event.create()
let triggerProgress ,progress = Event.create<int>()
let asyncGroup = match asyncGroup with None -> new AsyncGroup() | Some ag -> ag
let doWork() =
asyncGroup.RunWithContinuations( (fun res -> post syncContext triggerCompleted res),
(fun exn -> post syncContext triggerError exn),
(fun exn -> post syncContext triggerCanceled exn ),
p)
member x.ReportProgress(progressPercentage) =
post syncContext triggerProgress progressPercentage
member x.RunAsync() =
ThreadPool.QueueUserWorkItem(fun args -> doWork())
member x.CancelAsync(?message) =
asyncGroup.TriggerCancel(?message=message);
member x.ProgressChanged = progress
member x.Completed = completed
member x.Canceled = canceled
member x.Error = error
#endif