Aracılığıyla paylaş


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: SynchronizationContext

    Gö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

Control.Async Sınıfı (F#)

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.