Async.SwitchToContext Yöntemi (F#)
Devamı kullanarak çalışan zaman uyumsuz bir hesaplama oluşturur Post yöntemi eşitleme içerik nesnesi.
İsim Uzayı/Modül Yolu Microsoft.FSharp.Control
Derleme FSharp.Core (FSharp.Core.dll içinde)
// Signature:
static member SwitchToContext : SynchronizationContext -> Async<unit>
// Usage:
Async.SwitchToContext (syncContext)
Parametreler
syncContext
Aşağıdakini yazın: SynchronizationContextGönderilen hesaplamayı kabul etmek için bir senkronizasyon bağlamı.
Dönüş Değeri
Kullandığı zaman uyumsuz bir hesaplama syncContext yürütmek için bağlam.
Açıklamalar
syncContext , Sonra da zaman uyumsuz hesaplaması için eşdeğer boş Async.SwitchToThreadPool.
Örnek
Aşağıdaki kod örneği nasıl kullanılacağı gösterilmiştir Async.SwitchToContext geçmek amacıyla UI iş parçacığı güncelleştirmek kullanıcı Arabirimi. Bu, servis talebi bir hesaplamanın 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 7, Windows Vista SP2, Windows XP SP3, Windows XP x64 SP2, Windows Server 2008 R2, Windows Server 2008 SP2, Windows Server 2003 SP2
Sürüm Bilgisi
F# Çalışma Zamanı
Desteklenir: 2.0, 4.0
Silverlight
Desteklenir: 3
Ayrıca bkz.
Başvuru
Microsoft.FSharp.Control İsim Uzayı (F#)
Değişiklik Geçmişi
Tarih |
Geçmiş |
Nedeni |
---|---|---|
Temmuz 2010 |
Eklenen kod örneği. |
Bilgi geliştirme. |