Поделиться через


Метод Async.RunSynchronously<'T> (F#)

Запускает асинхронное вычисление и ожидает его результат.

Пространство имен/путь к модулю: Microsoft.FSharp.Control

Сборка: FSharp.Core (в FSharp.Core.dll)

// Signature:
static member RunSynchronously : Async<'T> * ?int * ?CancellationToken -> 'T

// Usage:
Async.RunSynchronously (computation)
Async.RunSynchronously (computation, timeout = timeout, cancellationToken = cancellationToken)

Параметры

  • computation
    Тип: Async<'T>

    Запускаемое вычисление.

  • timeout
    Тип: int

    Интервал времени в миллисекундах ожидания результата вычисления до создания исключения TimeoutException. Если значение времени ожидания не указано, для соответствия Infinite используется значение по умолчанию — -1.

  • cancellationToken
    Тип: CancellationToken

    Токен отмены, который необходимо связать с вычислением. Если токен отмены не указан, используется токен отмены по умолчанию.

Возвращаемое значение

Результат вычисления.

Заметки

При возникновении исключения в ходе асинхронного вычисления данная функция создаст повторное исключение. Если токен отмены не указан, используется токен отмены по умолчанию. Параметр времени ожидания указывается в миллисекундах. Значение -1 эквивалентно Infinite.

Async.RunSynchronously не следует использовать в главном потоке в средах асинхронного программирования, например в приложениях на основе Silverlight.

Пример

В следующем примере показано как использовать Async.RunSynchronously для запуска асинхронного вычисления, созданного с помощью Async.Parallel, без таймаута.

let bufferData (number:int) =
    [| for count in 1 .. 1000 -> byte (count % 256) |]
    |> Array.permute (fun index -> index)

let writeFile fileName bufferData =
    async {
      use outputFile = System.IO.File.Create(fileName)
      do! outputFile.AsyncWrite(bufferData) 
    }

Seq.init 1000 (fun num -> bufferData num)
|> Seq.mapi (fun num value -> writeFile ("file" + num.ToString() + ".dat") value)
|> Async.Parallel
|> Async.RunSynchronously
|> ignore

В следующем примере показано, как использовать Async.RunSynchronously с таймаутом.

let bufferData (number:int) =
    [| for i in 1 .. 1000 -> byte (i % 256) |]
    |> Array.permute (fun index -> index)

// Create a counter as a reference cell that can be modified in parallel.
let counter = ref 0

// writeFileInner writes the data to an open stream
// that represents the file. It also updates the counter.

// The counter is locked because it will be accessed by
// multiple asynchronous computations.

// The counter must be updated as soon as the
// AsyncWrite completes, in the same synchronous
// program flow. There must not be a let! or do! between
// the AsyncWrite call and the counter update.
let writeFileInner (stream:System.IO.Stream) data =
    let result = stream.AsyncWrite(data)
    lock counter (fun () -> counter := !counter + 1)
    result

// writeFile encapsulates the asynchronous write operation.
// The do! includes both the file I/O operation and the
// counter update in order to keep those operations
// together.
let writeFile fileName bufferData =
    async {
      use outputFile = System.IO.File.Create(fileName)
      do! writeFileInner outputFile bufferData
      // Updating the counter here would not be effective.
    }

let async1 = Seq.init 1000 (fun num -> bufferData num)
             |> Seq.mapi (fun num value ->
                 writeFile ("file" + num.ToString() + ".dat") value)
             |> Async.Parallel
try
    Async.RunSynchronously(async1, 100) |> ignore
with
   | exc -> printfn "%s" exc.Message
            printfn "%d write operations completed successfully." !counter

Пример результатов

      

Платформы

Windows 7, Windows Vista с пакетом обновления 2 (SP2), Windows XP с пакетом обновления 3 (SP3), Windows XP x64 с пакетом обновления 2 (SP2), Windows Server 2008 R2, Windows Server 2008 с пакетом обновления 2 (SP2), Windows Server 2003 с пакетом обновления 2 (SP2)

Сведения о версии

Среда выполнения F#

Поддерживается в версиях 2.0, 4.0

Silverlight

Поддерживается в версии 3

См. также

Ссылки

Класс Control.Async (F#)

Пространство имен Microsoft.FSharp.Control (F#)

Журнал изменений

Дата

Журнал

Причина

Июль 2010

Добавлены примеры кода.

Улучшение информации.