Метод 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.
Если указать отменяемый токен отмены, то время ожидания игнорируется. Вместо этого можно реализовать собственное значение можно отменить операцию. Токен отмены отменяемой, если свойству CanBeCanceled присвоено значение true.
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 8, Windows 7, Windows Server 2012 и Windows Server 2008 R2
Сведения о версии
Основные версии библиотеки F#
Поддерживается в версиях 2.0, 4.0, портативное