ManagedThreadId返回2个线程

时间:2016-01-16 07:18:22

标签: c# multithreading c#-4.0 task c#-5.0

请考虑以下代码:

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内的代码是否在一个单独的线程中运行?

由于

1 个答案:

答案 0 :(得分:4)

当你this.Invoke时,你告诉它回到UI线程。将Thread.CurrentThread.ManagedThreadId移到调用之外,您将看到与UI线程不同的ID。

此外,如果您想保证在线程池线程上完成工作,请使用Task.Run或传递StartNew TaskScheduler.Default,如果不这样做,则可以从Task.Factory.StartNew调用代码在UI线程上继续运行。见StartNew is Dangerous