Async.SwitchToContext, méthode (F#)
Crée un calcul asynchrone qui exécute sa continuation à l'aide de la méthode Post sur l'objet de contexte de synchronisation.
Espace de noms/Chemin du module : Microsoft.FSharp.Control
Assembly : FSharp.Core (in FSharp.Core.dll)
// Signature:
static member SwitchToContext : SynchronizationContext -> Async<unit>
// Usage:
Async.SwitchToContext (syncContext)
Paramètres
syncContext
Type : SynchronizationContextContexte de synchronisation acceptant le calcul publié.
Valeur de retour
Calcul asynchrone qui utilise le contexte syncContext pour s'exécuter.
Notes
Si syncContext a la valeur Null, le calcul asynchrone est équivalent à Async.SwitchToThreadPool.
Exemple
L'exemple de code suivant illustre comment utiliser Async.SwitchToContext pour basculer vers le thread d'interface utilisateur pour mettre à jour l'interface utilisateur. Dans ce cas, une barre de progression qui indique l'état de l'achèvement d'un calcul est mise à jour.
open System.Windows.Forms
let form = new Form(Text = "Test Form", Width = 400, Height = 400)
let syncContext = System.Threading.SynchronizationContext.Current
let button1 = new Button(Text = "Start")
let label1 = new Label(Text = "", Height = 200, Width = 200,
Top = button1.Height + 10)
form.Controls.AddRange([| button1; label1 |] )
type invokeFunction = delegate of unit -> unit
let async1(syncContext, form : System.Windows.Forms.Form) =
async {
let label1 = form.Controls.[1]
// Do something.
do! Async.Sleep(1000)
// Switch to the UI thread and update the UI.
do! Async.SwitchToContext(syncContext)
let threadNumber = System.Threading.Thread.CurrentThread.ManagedThreadId
label1.Text <- label1.Text + sprintf "On the UI Thread [%d]\n" threadNumber
// Switch back to the thread pool.
do! Async.SwitchToThreadPool()
// Do something.
do! Async.Sleep(1000)
let threadNumber = System.Threading.Thread.CurrentThread.ManagedThreadId
// When on a thread pool thread, use Control.Invoke to update UI.
label1.Invoke(new invokeFunction(fun () ->
label1.Text <- label1.Text +
sprintf "Switched to thread pool [%d]\n" threadNumber)) |> ignore
}
let buttonClick(sender:obj, args) =
let button = sender :?> Button
Async.Start(async1(syncContext, button.Parent :?> Form))
let threadNumber = System.Threading.Thread.CurrentThread.ManagedThreadId
label1.Text <- sprintf "Started asynchronous workflow [%d]\n" threadNumber
()
button1.Click.AddHandler(fun sender args -> buttonClick(sender, args))
Application.Run(form)
Plateformes
Windows 7, Windows Vista SP2, Windows XP SP3, Windows XP x64 SP2, Windows Server 2008 R2, Windows Server 2008 SP2, Windows Server 2003 SP2
Informations de version
Runtime F#
Pris en charge dans : 2.0, 4.0
Silverlight
Prise en charge dans : 3
Voir aussi
Référence
Microsoft.FSharp.Control, espace de noms (F#)
Historique des modifications
Date |
Historique |
Motif |
---|---|---|
Juillet 2010 |
Ajout d'un exemple de code |
Améliorations apportées aux informations. |