Thread.CurrentThread 属性
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
获取当前正在运行的线程。
public:
static property System::Threading::Thread ^ CurrentThread { System::Threading::Thread ^ get(); };
public static System.Threading.Thread CurrentThread { get; }
static member CurrentThread : System.Threading.Thread
Public Shared ReadOnly Property CurrentThread As Thread
属性值
Thread,表示当前正在运行的线程。
示例
以下示例创建一个任务,该任务又创建 20 个子任务。 应用程序本身以及每个任务都调用 ShowThreadInformation
方法,该方法使用 CurrentThread 属性显示有关运行它的线程的信息。
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
private static Object lockObj = new Object();
private static Object rndLock = new Object();
public static void Main()
{
Random rnd = new Random();
var tasks = new List<Task<Double>>();
ShowThreadInformation("Application");
Task<Double> t = Task.Run( () => { ShowThreadInformation("Main Task(Task #" + Task.CurrentId.ToString() + ")");
for (int ctr = 1; ctr <= 20; ctr++)
tasks.Add(Task.Factory.StartNew(
() => { ShowThreadInformation("Task #" + Task.CurrentId.ToString());
long s = 0;
for (int n = 0; n <= 999999; n++) {
lock (rndLock) {
s += rnd.Next(1, 1000001);
}
}
return s/1000000.0;
} ));
Task.WaitAll(tasks.ToArray());
Double grandTotal = 0;
Console.WriteLine("Means of each task: ");
foreach (var child in tasks) {
Console.WriteLine(" {0}", child.Result);
grandTotal += child.Result;
}
Console.WriteLine();
return grandTotal / 20;
} );
Console.WriteLine("Mean of Means: {0}", t.Result);
}
private static void ShowThreadInformation(String taskName)
{
String msg = null;
Thread thread = Thread.CurrentThread;
lock(lockObj) {
msg = String.Format("{0} thread information\n", taskName) +
String.Format(" Background: {0}\n", thread.IsBackground) +
String.Format(" Thread Pool: {0}\n", thread.IsThreadPoolThread) +
String.Format(" Thread ID: {0}\n", thread.ManagedThreadId);
}
Console.WriteLine(msg);
}
}
// The example displays output like the following:
// Application thread information
// Background: False
// Thread Pool: False
// Thread ID: 1
//
// Main Task(Task #1) thread information
// Background: True
// Thread Pool: True
// Thread ID: 3
//
// Task #2 thread information
// Background: True
// Thread Pool: True
// Thread ID: 4
//
// Task #4 thread information
// Background: True
// Thread Pool: True
// Thread ID: 10
//
// Task #3 thread information
// Background: True
// Thread Pool: True
// Thread ID: 9
//
// Task #5 thread information
// Background: True
// Thread Pool: True
// Thread ID: 3
//
// Task #7 thread information
// Background: True
// Thread Pool: True
// Thread ID: 5
//
// Task #6 thread information
// Background: True
// Thread Pool: True
// Thread ID: 7
//
// Task #8 thread information
// Background: True
// Thread Pool: True
// Thread ID: 6
//
// Task #9 thread information
// Background: True
// Thread Pool: True
// Thread ID: 8
//
// Task #10 thread information
// Background: True
// Thread Pool: True
// Thread ID: 9
//
// Task #11 thread information
// Background: True
// Thread Pool: True
// Thread ID: 10
//
// Task #12 thread information
// Background: True
// Thread Pool: True
// Thread ID: 6
//
// Task #13 thread information
// Background: True
// Thread Pool: True
// Thread ID: 4
//
// Task #14 thread information
// Background: True
// Thread Pool: True
// Thread ID: 3
//
// Task #15 thread information
// Background: True
// Thread Pool: True
// Thread ID: 7
//
// Task #16 thread information
// Background: True
// Thread Pool: True
// Thread ID: 5
//
// Task #17 thread information
// Background: True
// Thread Pool: True
// Thread ID: 8
//
// Task #18 thread information
// Background: True
// Thread Pool: True
// Thread ID: 9
//
// Task #19 thread information
// Background: True
// Thread Pool: True
// Thread ID: 10
//
// Task #20 thread information
// Background: True
// Thread Pool: True
// Thread ID: 4
//
// Task #21 thread information
// Background: True
// Thread Pool: True
// Thread ID: 7
//
// Means of each task:
// 500038.740584
// 499810.422703
// 500217.558077
// 499868.534688
// 499295.505866
// 499893.475772
// 499601.454469
// 499828.532502
// 499606.183978
// 499700.276056
// 500415.894952
// 500005.874751
// 500042.237016
// 500092.764753
// 499998.798267
// 499623.054718
// 500018.784823
// 500286.865993
// 500052.68285
// 499764.363303
//
// Mean of Means: 499908.10030605
open System
open System.Threading
open System.Threading.Tasks
let lockObj = obj ()
let rndLock = obj ()
let showThreadInformation taskName =
let thread = Thread.CurrentThread
lock lockObj (fun () ->
printfn
$"{taskName} thread information\n Background: {thread.IsBackground}\n Thread Pool: {thread.IsThreadPoolThread}\n Thread ID: {thread.ManagedThreadId}\n")
let rnd = Random()
showThreadInformation "Application"
let t =
Task.Run(fun () ->
showThreadInformation $"Main Task(Task #{Task.CurrentId})"
let tasks =
[| for _ = 1 to 20 do
Task.Factory.StartNew(fun () ->
showThreadInformation $"Task #{Task.CurrentId}"
let mutable s = 0L
for n = 0 to 999999 do
lock rndLock (fun () -> s <- s + (rnd.Next(1, 1000001) |> int64))
float s / 1000000.) |]
Task.WaitAll(box tasks :?> Task[])
let mutable grandTotal = 0.
printfn "Means of each task: "
for child in tasks do
printfn $" {child.Result}"
grandTotal <- grandTotal + child.Result
printfn ""
grandTotal / 20.)
printfn $"Mean of Means: {t.Result}"
// The example displays output like the following:
// Application thread information
// Background: False
// Thread Pool: False
// Thread ID: 1
//
// Main Task(Task #1) thread information
// Background: True
// Thread Pool: True
// Thread ID: 3
//
// Task #2 thread information
// Background: True
// Thread Pool: True
// Thread ID: 4
//
// Task #4 thread information
// Background: True
// Thread Pool: True
// Thread ID: 10
//
// Task #3 thread information
// Background: True
// Thread Pool: True
// Thread ID: 9
//
// Task #5 thread information
// Background: True
// Thread Pool: True
// Thread ID: 3
//
// Task #7 thread information
// Background: True
// Thread Pool: True
// Thread ID: 5
//
// Task #6 thread information
// Background: True
// Thread Pool: True
// Thread ID: 7
//
// Task #8 thread information
// Background: True
// Thread Pool: True
// Thread ID: 6
//
// Task #9 thread information
// Background: True
// Thread Pool: True
// Thread ID: 8
//
// Task #10 thread information
// Background: True
// Thread Pool: True
// Thread ID: 9
//
// Task #11 thread information
// Background: True
// Thread Pool: True
// Thread ID: 10
//
// Task #12 thread information
// Background: True
// Thread Pool: True
// Thread ID: 6
//
// Task #13 thread information
// Background: True
// Thread Pool: True
// Thread ID: 4
//
// Task #14 thread information
// Background: True
// Thread Pool: True
// Thread ID: 3
//
// Task #15 thread information
// Background: True
// Thread Pool: True
// Thread ID: 7
//
// Task #16 thread information
// Background: True
// Thread Pool: True
// Thread ID: 5
//
// Task #17 thread information
// Background: True
// Thread Pool: True
// Thread ID: 8
//
// Task #18 thread information
// Background: True
// Thread Pool: True
// Thread ID: 9
//
// Task #19 thread information
// Background: True
// Thread Pool: True
// Thread ID: 10
//
// Task #20 thread information
// Background: True
// Thread Pool: True
// Thread ID: 4
//
// Task #21 thread information
// Background: True
// Thread Pool: True
// Thread ID: 7
//
// Means of each task:
// 500038.740584
// 499810.422703
// 500217.558077
// 499868.534688
// 499295.505866
// 499893.475772
// 499601.454469
// 499828.532502
// 499606.183978
// 499700.276056
// 500415.894952
// 500005.874751
// 500042.237016
// 500092.764753
// 499998.798267
// 499623.054718
// 500018.784823
// 500286.865993
// 500052.68285
// 499764.363303
//
// Mean of Means: 499908.10030605
Imports System.Collections.Generic
Imports System.Threading
Imports System.Threading.Tasks
Module Example
Private lockObj As New Object()
Private rndLock As New Object()
Public Sub Main()
Dim rnd As New Random()
Dim tasks As New List(Of Task)
ShowThreadInformation("Application")
Dim t As Task(Of Double) = Task.Run( Function()
ShowThreadInformation("Main Task(Task #" + Task.CurrentId.ToString() + ")")
For ctr As Integer = 1 To 20
tasks.Add(Task.Factory.StartNew( Function()
ShowThreadInformation("Task #" + Task.CurrentId.ToString())
Dim s As Long = 0
For n As Integer = 0 To 999999
SyncLock rndLock
s += rnd.Next(1, 1000001)
End SyncLock
Next
Return s/1000000
End Function))
Next
Task.WaitAll(tasks.ToArray())
Dim grandTotal As Double
Console.WriteLine("Means of each task: ")
For Each t In tasks
Console.WriteLine(" {0}", t.Result)
grandTotal += t.Result
Next
Console.WriteLine()
Return grandTotal / 20
End Function )
Console.WriteLine("Mean of Means: {0}", t.Result)
End Sub
Private Sub ShowThreadInformation(taskName As String)
Dim msg As String = Nothing
Dim thread As Thread = Thread.CurrentThread
SyncLock lockObj
msg = String.Format("{0} thread information", taskName) + vbCrLf +
String.Format(" Background: {0}", thread.IsBackground) + vbCrLf +
String.Format(" Thread Pool: {0}", thread.IsThreadPoolThread) + vbCrLf +
String.Format(" Thread ID: {0}", thread.ManagedThreadId) + vbCrLf
End SyncLock
Console.WriteLine(msg)
End Sub
End Module
' The example displays output like the following:
' Application thread information
' Background: False
' Thread Pool: False
' Thread ID: 1
'
' Main Task(Task #1) thread information
' Background: True
' Thread Pool: True
' Thread ID: 3
'
' Task #2 thread information
' Background: True
' Thread Pool: True
' Thread ID: 4
'
' Task #4 thread information
' Background: True
' Thread Pool: True
' Thread ID: 10
'
' Task #3 thread information
' Background: True
' Thread Pool: True
' Thread ID: 9
'
' Task #5 thread information
' Background: True
' Thread Pool: True
' Thread ID: 3
'
' Task #7 thread information
' Background: True
' Thread Pool: True
' Thread ID: 5
'
' Task #6 thread information
' Background: True
' Thread Pool: True
' Thread ID: 7
'
' Task #8 thread information
' Background: True
' Thread Pool: True
' Thread ID: 6
'
' Task #9 thread information
' Background: True
' Thread Pool: True
' Thread ID: 8
'
' Task #10 thread information
' Background: True
' Thread Pool: True
' Thread ID: 9
'
' Task #11 thread information
' Background: True
' Thread Pool: True
' Thread ID: 10
'
' Task #12 thread information
' Background: True
' Thread Pool: True
' Thread ID: 6
'
' Task #13 thread information
' Background: True
' Thread Pool: True
' Thread ID: 4
'
' Task #14 thread information
' Background: True
' Thread Pool: True
' Thread ID: 3
'
' Task #15 thread information
' Background: True
' Thread Pool: True
' Thread ID: 7
'
' Task #16 thread information
' Background: True
' Thread Pool: True
' Thread ID: 5
'
' Task #17 thread information
' Background: True
' Thread Pool: True
' Thread ID: 8
'
' Task #18 thread information
' Background: True
' Thread Pool: True
' Thread ID: 9
'
' Task #19 thread information
' Background: True
' Thread Pool: True
' Thread ID: 10
'
' Task #20 thread information
' Background: True
' Thread Pool: True
' Thread ID: 4
'
' Task #21 thread information
' Background: True
' Thread Pool: True
' Thread ID: 7
'
' Means of each task:
' 500038.740584
' 499810.422703
' 500217.558077
' 499868.534688
' 499295.505866
' 499893.475772
' 499601.454469
' 499828.532502
' 499606.183978
' 499700.276056
' 500415.894952
' 500005.874751
' 500042.237016
' 500092.764753
' 499998.798267
' 499623.054718
' 500018.784823
' 500286.865993
' 500052.68285
' 499764.363303
'
' Mean of Means: 499908.10030605/
每个子任务生成 100 万个介于 100 万到 100 万之间的随机数,并返回其平均值。 父任务调用 Task.WaitAll 方法,以确保子任务在显示每个任务返回的平均值并计算平均值之前已完成。
请注意,当应用程序在前台线程上运行时,每个任务在线程池线程上运行。