请考虑以下代码:
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);
我得到了这个结果:
输入主题当前线程ID为:10
0当前线程ID为:10
1当前线程ID是:10
3当前线程ID是:10
6当前线程ID是:10
10当前线程ID是:10
我在Windows Form Application上运行此代码。为什么Thread.CurrentThread.ManagedThreadId
为UI线程和任务线程返回相同的值? Task
内的代码是否在一个单独的线程中运行?
由于
答案 0 :(得分:4)
当你this.Invoke
时,你告诉它回到UI线程。将Thread.CurrentThread.ManagedThreadId
移到调用之外,您将看到与UI线程不同的ID。
此外,如果您想保证在线程池线程上完成工作,请使用Task.Run
或传递StartNew TaskScheduler.Default
,如果不这样做,则可以从Task.Factory.StartNew
调用代码在UI线程上继续运行。见StartNew is Dangerous