Task.RunSynchronously 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
현재 Task에서 TaskScheduler를 동기적으로 실행합니다.
오버로드
RunSynchronously() |
현재 Task에서 TaskScheduler를 동기적으로 실행합니다. |
RunSynchronously(TaskScheduler) |
제공된 Task에서 TaskScheduler를 동기적으로 실행합니다. |
RunSynchronously()
- Source:
- Task.cs
- Source:
- Task.cs
- Source:
- Task.cs
현재 Task에서 TaskScheduler를 동기적으로 실행합니다.
public:
void RunSynchronously();
public void RunSynchronously ();
member this.RunSynchronously : unit -> unit
Public Sub RunSynchronously ()
예외
Task 인스턴스가 삭제되었습니다.
Task 가 시작할 수 있는 상태가 아닙니다. 이미 시작되었거나, 실행되었거나, 취소되었거나 아니면 직접 일정 관리를 지원하지 않는 방식으로 만들어졌을 수 있습니다.
예제
다음 예제에서는 메서드를 호출 RunSynchronously 하여 실행된 작업을 비동기적으로 실행된 작업과 비교합니다. 두 경우 모두 태스크는 태스크가 실행 중인 스레드의 ID와 작업 ID를 표시하는 동일한 람다 식을 실행합니다. 이 작업은 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 하여 태스크가 throw할 수 있는 예외를 처리해야 합니다. 예외 처리에 대한 자세한 내용은 예외 처리를 참조하세요.
메서드를 호출 RunSynchronously 하여 실행된 작업은 또는 Task<TResult> 클래스 생성자를 호출 Task 하여 인스턴스화됩니다. 동기적으로 실행할 작업이 상태여야 Created 합니다. 작업을 시작하고 한 번만 실행할 수 있습니다. 작업을 두 번째로 예약하려고 시도하면 예외가 발생합니다.
추가 정보
적용 대상
RunSynchronously(TaskScheduler)
- Source:
- Task.cs
- Source:
- Task.cs
- Source:
- 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<TResult> 클래스 생성자를 호출 Task 하여 인스턴스화됩니다. 동기적으로 실행할 작업이 상태여야 Created 합니다. 작업을 시작하고 한 번만 실행할 수 있습니다. 작업을 두 번째로 예약하려고 시도하면 예외가 발생합니다.
대상 스케줄러가 현재 스레드에서 이 작업 실행을 지원하지 않는 경우 작업은 스케줄러에서 실행될 예정이며 작업이 완료될 때까지 현재 스레드가 차단됩니다. 이 때문에 호출 스레드는 태스크가 실행을 완료했는지 확인하기 위해 와 같은 Wait 메서드를 호출할 필요가 없습니다. 작업 작업에 대한 예외 처리에 대한 자세한 내용은 예외 처리를 참조하세요.
추가 정보
적용 대상
.NET