none
更改Thread.Name属性时候出现的无法更改问题,求助额~~~~ RRS feed

  • 问题

  • 先贴错误提示再贴代码

    “System.InvalidOperationException”类型的未经处理的异常出现在 mscorlib.dll 中。

    调试中断的地方为thread1.Name = "";和thread2.Name = "";的地方
    其他信息: 该属性已经设置,不能修改。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace _2._1_2._2
    {
        public partial class Form1 : Form
        {
           public Form1()
            {
                InitializeComponent();
                CheckForIllegalCrossThreadCalls = false;
            }
            public void btn1_change()
            {
                int i = 0;
                for(; i < 10; i++)
                {
                    Thread thread1 = Thread.CurrentThread;
                   thread1.Name = "btn1_change";
    
                    label1.Text = String.Format("{0},{1}", i,  thread1.Name);
                    label1.Refresh();
                    Thread.Sleep(500);
                }
            }
              public void btn2_change()
            {
                int i = 0;
                for(; i < 10; i++)
                {
                    Thread thread2 = Thread.CurrentThread;
                    thread2.Name = "btn2_change";
                    label2.Text = String.Format("{0},{1}", i, thread2.Name);
    
                    label2.Refresh();
                    Thread.Sleep(500);
                }
            }
           
    
            private void button1_Click(object sender, EventArgs e)
            {
                Thread thread1 = new Thread(new ThreadStart(btn1_change));
               
                thread1.Start();
    
    
                Thread thread2 = new Thread(new ThreadStart(btn2_change));
                thread2.Start();
            }
          
        }
    }
     



    vortex.piggy




    2012年2月12日 8:30

答案

  • 简单的说,threa.Name 是个write-once property,所以你第一次赋值以后就不能再次修改它了,,至于为什么这么设计的原因你可以参考下面的2个URL

    http://social.msdn.microsoft.com/Forums/en-SG/netfxbcl/thread/c59593fb-4961-4eb9-9321-f165d96fa9ef

    http://blogs.msdn.com/b/bclteam/archive/2003/11/11/49736.aspx



    2012年2月12日 12:50
  • “其他信息: 该属性已经设置,不能修改” 提示信息不是写的很清楚了嘛,这肯定是你命名过一次后的再次赋值。
    2012年2月12日 13:35
  • 请改为如下的代码:

    usingSystem;
    usingSystem.Collections.Generic;
    usingSystem.ComponentModel;
    usingSystem.Data;
    usingSystem.Drawing;
    usingSystem.Linq;
    usingSystem.Text;
    usingSystem.Windows.Forms;
    usingSystem.Threading;

    namespace_2._1_2._2
    {
       
    publicpartialclassForm1:Form
       
    {
          
    publicForm1()
           
    {
               
    InitializeComponent();
               
    CheckForIllegalCrossThreadCalls=false;
           
    }
           
    publicvoidbtn1_change()
           
    {
               
    int i =0; thread1.Name="btn1_change";

               
    for(;i <10;i++)
               
    {
                   
    Threadthread1 =Thread.CurrentThread;
                  

                    label1
    .Text=String.Format("{0},{1}",i,  thread1.Name);
                    label1
    .Refresh();
                   
    Thread.Sleep(500);
               
    }
           
    }
             
    publicvoidbtn2_change()
           
    {
               
    int i =0; thread2.Name="btn2_change";

               
    for(;i <10;i++)
               
    {
                   
    Threadthread2 =Thread.CurrentThread;
                    
                    label2.Text=String.Format("{0},{1}",i,thread2.Name);

                    label2
    .Refresh();
                   
    Thread.Sleep(500);
               
    }
           
    }
          

           
    privatevoidbutton1_Click(objectsender,EventArgse)
           
    {
               
    Threadthread1 =newThread(newThreadStart(btn1_change));thread1.Start();


               
    Threadthread2 =newThread(newThreadStart(btn2_change));
                thread2
    .Start();
           
    }
         
       
    }
    }


    2012年2月12日 13:43

全部回复

  • 为什么没有人回答额....这个貌似不应该出现的问题把我搞的好纠结额,希望同志们能拉我一把~~感激不尽

    vortex.piggy

    2012年2月12日 9:28
  • 简单的说,threa.Name 是个write-once property,所以你第一次赋值以后就不能再次修改它了,,至于为什么这么设计的原因你可以参考下面的2个URL

    http://social.msdn.microsoft.com/Forums/en-SG/netfxbcl/thread/c59593fb-4961-4eb9-9321-f165d96fa9ef

    http://blogs.msdn.com/b/bclteam/archive/2003/11/11/49736.aspx



    2012年2月12日 12:50
  • 多谢回答噢~~不过我每个线程都只命名过一次额, 为什么也有这种问题呢?


    vortex.piggy

    2012年2月12日 13:17
  • “其他信息: 该属性已经设置,不能修改” 提示信息不是写的很清楚了嘛,这肯定是你命名过一次后的再次赋值。
    2012年2月12日 13:35
  • 麻烦帮忙看下代码中在哪重复赋值了好么,多谢多谢~

    vortex.piggy

    2012年2月12日 13:40
  • 请改为如下的代码:

    usingSystem;
    usingSystem.Collections.Generic;
    usingSystem.ComponentModel;
    usingSystem.Data;
    usingSystem.Drawing;
    usingSystem.Linq;
    usingSystem.Text;
    usingSystem.Windows.Forms;
    usingSystem.Threading;

    namespace_2._1_2._2
    {
       
    publicpartialclassForm1:Form
       
    {
          
    publicForm1()
           
    {
               
    InitializeComponent();
               
    CheckForIllegalCrossThreadCalls=false;
           
    }
           
    publicvoidbtn1_change()
           
    {
               
    int i =0; thread1.Name="btn1_change";

               
    for(;i <10;i++)
               
    {
                   
    Threadthread1 =Thread.CurrentThread;
                  

                    label1
    .Text=String.Format("{0},{1}",i,  thread1.Name);
                    label1
    .Refresh();
                   
    Thread.Sleep(500);
               
    }
           
    }
             
    publicvoidbtn2_change()
           
    {
               
    int i =0; thread2.Name="btn2_change";

               
    for(;i <10;i++)
               
    {
                   
    Threadthread2 =Thread.CurrentThread;
                    
                    label2.Text=String.Format("{0},{1}",i,thread2.Name);

                    label2
    .Refresh();
                   
    Thread.Sleep(500);
               
    }
           
    }
          

           
    privatevoidbutton1_Click(objectsender,EventArgse)
           
    {
               
    Threadthread1 =newThread(newThreadStart(btn1_change));thread1.Start();


               
    Threadthread2 =newThread(newThreadStart(btn2_change));
                thread2
    .Start();
           
    }
         
       
    }
    }


    2012年2月12日 13:43
  • 噢!!!!!!!!我嘞个去。。。原来如此,明白了。。。。。多谢多谢

    vortex.piggy

    2012年2月12日 13:44