Task.RunSynchronously Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Синхронно выполняет задачу Task в текущем планировщике TaskScheduler.
Перегрузки
RunSynchronously() |
Синхронно выполняет задачу Task в текущем планировщике TaskScheduler. |
RunSynchronously(TaskScheduler) |
Синхронно выполняет задачу Task в предоставленном планировщике TaskScheduler. |
RunSynchronously()
- Исходный код:
- Task.cs
- Исходный код:
- Task.cs
- Исходный код:
- Task.cs
Синхронно выполняет задачу Task в текущем планировщике TaskScheduler.
public:
void RunSynchronously();
public void RunSynchronously ();
member this.RunSynchronously : unit -> unit
Public Sub RunSynchronously ()
Исключения
Экземпляр Task удален.
Задача Task не находится в допустимом состоянии для запуска. Возможно, она уже запущена, выполнена или отменена, или она была создана способом, не поддерживающим прямое планирование.
Примеры
В следующем примере сравнивается задача, выполняемая путем вызова RunSynchronously метода , с задачей, выполняемой асинхронно. В обоих случаях задачи выполняют одинаковые лямбда-выражения, отображающие идентификатор задачи и идентификатор потока, в котором выполняется задача. Задача вычисляет сумму целых чисел от 1 до 1 000 000. Как показано в выходных данных примера, задача, выполняемая путем вызова RunSynchronously метода , выполняется в потоке приложения, а асинхронная задача — нет.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
Console.WriteLine("Application executing on thread {0}",
Thread.CurrentThread.ManagedThreadId);
var asyncTask = Task.Run( () => { Console.WriteLine("Task {0} (asyncTask) executing on Thread {1}",
Task.CurrentId,
Thread.CurrentThread.ManagedThreadId);
long sum = 0;
for (int ctr = 1; ctr <= 1000000; ctr++ )
sum += ctr;
return sum;
});
var syncTask = new Task<long>( () => { Console.WriteLine("Task {0} (syncTask) executing on Thread {1}",
Task.CurrentId,
Thread.CurrentThread.ManagedThreadId);
long sum = 0;
for (int ctr = 1; ctr <= 1000000; ctr++ )
sum += ctr;
return sum;
});
syncTask.RunSynchronously();
Console.WriteLine();
Console.WriteLine("Task {0} returned {1:N0}", syncTask.Id, syncTask.Result);
Console.WriteLine("Task {0} returned {1:N0}", asyncTask.Id, asyncTask.Result);
}
}
// The example displays the following output:
// Application executing on thread 1
// Task 1 (syncTask) executing on Thread 1
// Task 2 (asyncTask) executing on Thread 3
// 1 status: RanToCompletion
// 2 status: RanToCompletion
//
// Task 2 returned 500,000,500,000
// Task 1 returned 500,000,500,000
open System
open System.Threading
open System.Threading.Tasks
printfn $"Application executing on thread {Thread.CurrentThread.ManagedThreadId}"
let asyncTask =
Task.Run(fun () ->
printfn $"Task {Task.CurrentId} (asyncTask) executing on Thread {Thread.CurrentThread.ManagedThreadId}"
let mutable sum = 0L
for i = 1 to 1000000 do
sum <- sum + int64 i
sum)
let syncTask =
new Task<int64>(fun () ->
printfn $"Task {Task.CurrentId} (syncTask) executing on Thread {Thread.CurrentThread.ManagedThreadId}"
let mutable sum = 0L
for i = 1 to 1000000 do
sum <- sum + int64 i
sum)
syncTask.RunSynchronously()
printfn $"\nTask {syncTask.Id} returned {syncTask.Result:N0}"
printfn $"Task {asyncTask.Id} returned {asyncTask.Result:N0}"
// The example displays the following output:
// Application executing on thread 1
// Task 1 (syncTask) executing on Thread 1
// Task 2 (asyncTask) executing on Thread 3
// 1 status: RanToCompletion
// 2 status: RanToCompletion
//
// Task 2 returned 500,000,500,000
// Task 1 returned 500,000,500,000
Imports System.Threading
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Console.WriteLine("Application executing on thread {0}",
Thread.CurrentThread.ManagedThreadId)
Dim asyncTask = Task.Run( Function()
Console.WriteLine("Task {0} (asyncTask) executing on Thread {1}",
Task.CurrentId,
Thread.CurrentThread.ManagedThreadId)
Dim sum As Long = 0
For ctr As Integer = 1 To 1000000
sum += ctr
Next
Return sum
End Function)
Dim syncTask As New Task(Of Long)( Function()
Console.WriteLine("Task {0} (syncTask) executing on Thread {1}",
Task.CurrentId,
Thread.CurrentThread.ManagedThreadId)
Dim sum As Long = 0
For ctr As Integer = 1 To 1000000
sum += ctr
Next
Return sum
End Function)
syncTask.RunSynchronously()
Console.WriteLine()
Console.WriteLine("Task {0} returned {1:N0}", syncTask.Id, syncTask.Result)
Console.WriteLine("Task {0} returned {1:N0}", asyncTask.Id, asyncTask.Result)
End Sub
End Module
' The example displays the following output:
' Application executing on thread 1
' Task 1 (syncTask) executing on Thread 1
' Task 2 (asyncTask) executing on Thread 3
' 1 status: RanToCompletion
' 2 status: RanToCompletion
'
' Task 2 returned 500,000,500,000
' Task 1 returned 500,000,500,000
Комментарии
Обычно задачи выполняются асинхронно в потоке пула потоков и не блокируют вызывающий поток. Задачи, выполняемые RunSynchronously() путем вызова метода , связаны с текущим TaskScheduler и выполняются в вызывающем потоке. Если целевой планировщик не поддерживает выполнение этой задачи в вызывающем потоке, задача будет запланирована на выполнение в планировщике, а вызывающий поток будет блокироваться до завершения выполнения задачи. Несмотря на то, что задача выполняется синхронно, вызывающий поток должен по-прежнему вызывать Wait для обработки любых исключений, которые может вызвать задача. Дополнительные сведения об обработке исключений см. в разделе Обработка исключений.
Задачи, выполняемые путем RunSynchronously вызова метода , создаются путем вызова конструктора Task класса или Task<TResult> . Задача, выполняемая синхронно, должна находиться в Created состоянии . Задача может быть запущена и запущена только один раз. Любые попытки запланировать задачу во второй раз приводят к исключению.
См. также раздел
Применяется к
RunSynchronously(TaskScheduler)
- Исходный код:
- Task.cs
- Исходный код:
- Task.cs
- Исходный код:
- Task.cs
Синхронно выполняет задачу Task в предоставленном планировщике TaskScheduler.
public:
void RunSynchronously(System::Threading::Tasks::TaskScheduler ^ scheduler);
public void RunSynchronously (System.Threading.Tasks.TaskScheduler scheduler);
member this.RunSynchronously : System.Threading.Tasks.TaskScheduler -> unit
Public Sub RunSynchronously (scheduler As TaskScheduler)
Параметры
- scheduler
- TaskScheduler
Планировщик, в котором следует попытаться выполнить задачу.
Исключения
Экземпляр Task удален.
Аргумент scheduler
имеет значение null
.
Задача Task не находится в допустимом состоянии для запуска. Возможно, она уже запущена, выполнена или отменена, или она была создана способом, не поддерживающим прямое планирование.
Комментарии
Задачи, выполняемые путем RunSynchronously вызова метода , создаются путем вызова конструктора Task класса или Task<TResult> . Задача, выполняемая синхронно, должна находиться в Created состоянии . Задача может быть запущена и запущена только один раз. Любые попытки запланировать задачу во второй раз приводят к исключению.
Если целевой планировщик не поддерживает выполнение этой задачи в текущем потоке, задача будет запланирована на выполнение в планировщике, а текущий поток будет блокироваться до завершения выполнения задачи. По этой причине вызывающем потоку не нужно вызывать метод, Wait например , чтобы убедиться, что задача завершена. Дополнительные сведения об обработке исключений для операций с задачами см. в разделе Обработка исключений.