Task.RunSynchronously Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Task Kör synkront på den aktuella TaskScheduler.
Överlagringar
| Name | Description |
|---|---|
| RunSynchronously() |
Task Kör synkront på den aktuella TaskScheduler. |
| RunSynchronously(TaskScheduler) |
Task Kör synkront på den TaskScheduler angivna. |
RunSynchronously()
- Källa:
- Task.cs
- Källa:
- Task.cs
- Källa:
- Task.cs
- Källa:
- Task.cs
- Källa:
- Task.cs
Task Kör synkront på den aktuella TaskScheduler.
public:
void RunSynchronously();
public void RunSynchronously();
member this.RunSynchronously : unit -> unit
Public Sub RunSynchronously ()
Undantag
Instansen Task har tagits bort.
Är Task inte i ett giltigt tillstånd som ska startas. Den kan redan ha startats, körts eller avbrutits, eller så kan den ha skapats på ett sätt som inte stöder direkt schemaläggning.
Exempel
I följande exempel jämförs en uppgift som körs genom att anropa RunSynchronously metoden med en som körs asynkront. I båda fallen kör aktiviteterna identiska lambda-uttryck som visar aktivitets-ID:t och ID:t för tråden som aktiviteten körs på. Aktiviteten beräknar summan av heltalen mellan 1 och 1 000 000. Som utdata från exemplet visar körs uppgiften som körs genom att anropa RunSynchronously metoden i programtråden, medan den asynkrona aktiviteten inte gör det.
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
Kommentarer
Vanligtvis körs uppgifter asynkront på en trådpoolstråd och blockerar inte den anropande tråden. Uppgifter som körs genom att anropa RunSynchronously() metoden är associerade med den aktuella TaskScheduler och körs i den anropande tråden. Om målschemaläggaren inte stöder körning av den här aktiviteten i den anropande tråden schemaläggs aktiviteten för körning i schemaläggaren och den anropande tråden blockeras tills aktiviteten har slutfört körningen. Även om aktiviteten körs synkront bör den anropande tråden fortfarande anropa Wait för att hantera eventuella undantag som aktiviteten kan utlösa. Mer information om undantagshantering finns i Undantagshantering.
Uppgifter som körs genom att anropa RunSynchronously metoden instansieras genom att anropa en Task konstruktor eller Task<TResult> klasskonstruktor. Uppgiften som ska köras synkront måste vara i tillståndet Created . En uppgift kan bara startas och köras en gång. Alla försök att schemalägga en aktivitet en andra gång resulterar i ett undantag.
Se även
Gäller för
RunSynchronously(TaskScheduler)
- Källa:
- Task.cs
- Källa:
- Task.cs
- Källa:
- Task.cs
- Källa:
- Task.cs
- Källa:
- Task.cs
Task Kör synkront på den TaskScheduler angivna.
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)
Parametrar
- scheduler
- TaskScheduler
Schemaläggaren som uppgiften ska köras på infogad.
Undantag
Instansen Task har tagits bort.
Argumentet scheduler är null.
Är Task inte i ett giltigt tillstånd som ska startas. Den kan redan ha startats, körts eller avbrutits, eller så kan den ha skapats på ett sätt som inte stöder direkt schemaläggning.
Kommentarer
Uppgifter som körs genom att anropa RunSynchronously metoden instansieras genom att anropa en Task konstruktor eller Task<TResult> klasskonstruktor. Uppgiften som ska köras synkront måste vara i tillståndet Created . En uppgift kan bara startas och köras en gång. Alla försök att schemalägga en aktivitet en andra gång resulterar i ett undantag.
Om målschemaläggaren inte stöder körning av den här aktiviteten i den aktuella tråden schemaläggs aktiviteten för körning i schemaläggaren och den aktuella tråden blockeras tills aktiviteten har slutfört körningen. På grund av detta behöver den anropande tråden inte anropa en metod, till exempel Wait för att säkerställa att uppgiften har slutfört körningen. Mer information om undantagshantering för aktivitetsåtgärder finns i Undantagshantering.