Async.SwitchToContext Yöntemi (F#)
Devamı kullanarak çalışan zaman uyumsuz bir hesaplama oluşturur Post eşitleme bağlamı nesnesi üzerinde yöntemi.
Ad alanı/modül yol: Microsoft.FSharp.Control
Derleme: FSharp.Core (FSharp.Core.dll),
// Signature:
static member SwitchToContext : SynchronizationContext -> Async<unit>
// Usage:
Async.SwitchToContext (syncContext)
Parametreler
syncContext
Türü:SynchronizationContextGönderilen hesaplamayı kabul etmek için bir senkronizasyon bağlamı.
Dönüş Değeri
Kullandığı zaman uyumsuz bir hesaplama syncContext içeriği yürütmek için.
Notlar
syncContext Zaman uyumsuz hesaplaması eşdeğeri olan null ise Async.SwitchToThreadPool.
Örnek
Aşağıdaki kod örneği nasıl kullanılacağı gösterilmiştir Async.SwitchToContext UI iş parçacığına UI güncelleştirmek için geçiş yapmak için. Bu konuda, büyük/küçük harf hesaplayarak tamamlanma durumunu gösteren bir ilerleme çubuğu güncellenir.
open System.Windows.Forms
let form = new Form(Text = "Test Form", Width = 400, Height = 400)
let syncContext = System.Threading.SynchronizationContext()
let button1 = new Button(Text = "Start")
let label1 = new Label(Text = "", Height = 200, Width = 200,
Top = button1.Height + 10)
form.Controls.AddRange([| button1; label1 |] )
let async1(syncContext, form : System.Windows.Forms.Form) =
async {
let label1 = form.Controls.[1]
// Do something.
do! Async.Sleep(10000)
let threadName = System.Threading.Thread.CurrentThread.Name
let threadNumber = System.Threading.Thread.CurrentThread.ManagedThreadId
label1.Text <- label1.Text + sprintf "Something [%s] [%d]" threadName threadNumber
// Switch to the UI thread and update the UI.
do! Async.SwitchToContext(syncContext)
let threadName = System.Threading.Thread.CurrentThread.Name
let threadNumber = System.Threading.Thread.CurrentThread.ManagedThreadId
label1.Text <- label1.Text + sprintf "Here [%s] [%d]" threadName threadNumber
// Switch back to the thread pool.
do! Async.SwitchToThreadPool()
// Do something.
do! Async.Sleep(10000)
let threadName = System.Threading.Thread.CurrentThread.Name
let threadNumber = System.Threading.Thread.CurrentThread.ManagedThreadId
label1.Text <- label1.Text +
sprintf "Switched to thread pool [%s] [%d]" threadName threadNumber
}
let buttonClick(sender:obj, args) =
let button = sender :?> Button
Async.Start(async1(syncContext, button.Parent :?> Form))
let threadName = System.Threading.Thread.CurrentThread.Name
let threadNumber = System.Threading.Thread.CurrentThread.ManagedThreadId
button.Parent.Text <- sprintf "Started asynchronous workflow [%s] [%d]" threadName threadNumber
()
button1.Click.AddHandler(fun sender args -> buttonClick(sender, args))
Application.Run(form)
Platformlar
Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2
Sürüm Bilgisi
F# Çekirdek Kitaplığı sürümleri
Desteklenen: 2.0, 4.0, Portable