ManagedThreadId return 2 个线程的相同值
ManagedThreadId return same value for 2 threads
请考虑此代码:
textBox1.Text = "Enter Thread Current Thread ID Is : " + Thread.CurrentThread.ManagedThreadId.ToString();
int result = 0;
Task t = Task.Factory.StartNew(delegate
{
for (int i = 0; i < 5; i++)
{
result = result + i;
System.Threading.Thread.Sleep(1000);
this.Invoke((Action)(() => textBox1.Text += Environment.NewLine + result.ToString() + " Current Thread ID Is : " + Thread.CurrentThread.ManagedThreadId.ToString()));
}
},CancellationToken.None, TaskCreationOptions.None);
我得到了这个结果:
Enter Thread Current Thread ID Is : 10
0 Current Thread ID Is : 10
1 Current Thread ID Is : 10
3 Current Thread ID Is : 10
6 Current Thread ID Is : 10
10 Current Thread ID Is : 10
我 运行 此代码在 Windows 表格申请中。为什么 Thread.CurrentThread.ManagedThreadId
return 相同的值 UI 线程和任务线程? Task
运行 中的代码是否在单独的线程中?
谢谢
当您执行 this.Invoke
时,您告诉它返回到 UI 线程。将 Thread.CurrentThread.ManagedThreadId
移到调用之外,您将看到与 UI 线程不同的 ID。
此外,如果您想保证在线程池线程上完成工作,请使用 Task.Run
或传递 StartNew TaskScheduler.Default
,否则可以从 [=14] 调用代码=] 意外地 运行 在 UI 线程上。参见 StartNew is Dangerous
请考虑此代码:
textBox1.Text = "Enter Thread Current Thread ID Is : " + Thread.CurrentThread.ManagedThreadId.ToString();
int result = 0;
Task t = Task.Factory.StartNew(delegate
{
for (int i = 0; i < 5; i++)
{
result = result + i;
System.Threading.Thread.Sleep(1000);
this.Invoke((Action)(() => textBox1.Text += Environment.NewLine + result.ToString() + " Current Thread ID Is : " + Thread.CurrentThread.ManagedThreadId.ToString()));
}
},CancellationToken.None, TaskCreationOptions.None);
我得到了这个结果:
Enter Thread Current Thread ID Is : 10
0 Current Thread ID Is : 10
1 Current Thread ID Is : 10
3 Current Thread ID Is : 10
6 Current Thread ID Is : 10
10 Current Thread ID Is : 10
我 运行 此代码在 Windows 表格申请中。为什么 Thread.CurrentThread.ManagedThreadId
return 相同的值 UI 线程和任务线程? Task
运行 中的代码是否在单独的线程中?
谢谢
当您执行 this.Invoke
时,您告诉它返回到 UI 线程。将 Thread.CurrentThread.ManagedThreadId
移到调用之外,您将看到与 UI 线程不同的 ID。
此外,如果您想保证在线程池线程上完成工作,请使用 Task.Run
或传递 StartNew TaskScheduler.Default
,否则可以从 [=14] 调用代码=] 意外地 运行 在 UI 线程上。参见 StartNew is Dangerous