C#线程给变量赋值问题!!
//声明一个变量publicintMyProperty{get;set;}privatevoidbutton1_Click(objectsender,EventArgse...
// 声明一个变量 public int MyProperty { get; set; }
private void button1_Click(object sender, EventArgs e) { Task task = Task.Factory.StartNew(() => { // 我知道这句是不能这样写的 this.button1.Enabled = false;
// 但这句能正常编译,为什么能正常编译?? // 请问这是线程安全的吗?? this.MyProperty = 10; }); } 展开
private void button1_Click(object sender, EventArgs e) { Task task = Task.Factory.StartNew(() => { // 我知道这句是不能这样写的 this.button1.Enabled = false;
// 但这句能正常编译,为什么能正常编译?? // 请问这是线程安全的吗?? this.MyProperty = 10; }); } 展开
4个回答
2013-07-16
展开全部
是的,在.net2.0的版本中这样写是可以,但是在后期版本中加入了线程的访问安全,你的button1是处于窗体的主线程中,所以在你自定义的线程中访问会报错。
这里有两种解决方案,一种是利用button1的委托来赋值,还有一种是把线程访问安全检测给关掉,关掉方法如下:在程序启动时加入System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
就可以了
解决方法2:
使用委托的方式访问控件。(示例)
A、首先声明一个委托。参数是要和控件需要的参数一致。
B、然后设计这个委托需要处理的方法。参数和委托的一致。在方法中去处理这个参数,访问另一线程中控件。
C、在本线程中当要访问另一线程创建的控件的时候,就可以先判断是否该控件需要安全访问。
delegate void appendstringdelete(string text);
if (textBox5.InvokeRequired)
{
appendstringdelete d = new appendstringdelete(kk);
textBox5.Invoke(d, "这样就可以用了");
//textBox5.AppendText("nihao");
}
else
{
textBox5.AppendText("nihao");
}
Private void kk(string text)
{
textBox5.AppendText(text);
}
这里有两种解决方案,一种是利用button1的委托来赋值,还有一种是把线程访问安全检测给关掉,关掉方法如下:在程序启动时加入System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
就可以了
解决方法2:
使用委托的方式访问控件。(示例)
A、首先声明一个委托。参数是要和控件需要的参数一致。
B、然后设计这个委托需要处理的方法。参数和委托的一致。在方法中去处理这个参数,访问另一线程中控件。
C、在本线程中当要访问另一线程创建的控件的时候,就可以先判断是否该控件需要安全访问。
delegate void appendstringdelete(string text);
if (textBox5.InvokeRequired)
{
appendstringdelete d = new appendstringdelete(kk);
textBox5.Invoke(d, "这样就可以用了");
//textBox5.AppendText("nihao");
}
else
{
textBox5.AppendText("nihao");
}
Private void kk(string text)
{
textBox5.AppendText(text);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-07-16
展开全部
你这个代码格式有点乱 不过c#线程使用大致注意两个地方吧 你这里有对form窗体button的操作 所以在线程运行时 你点击按钮可能会造成影响 所以你需要给一段代码进行lock上锁操作等
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-07-16
展开全部
这是运行时的错误,原因还是在程序运行当中,才能知道是不是在主线程操作的控件。这是我个人的理解。至于解决这个问题,可以将项目属性设置为-允许不安全代码,或者使用委托。通过主线程Invoke调用委托方法。
委托的话我个人喜欢使用匿名的委托,因为比较方便。
this.Invoke(new MethodInvoker(delegate()
{
//在这里操作控件
}));
委托的话我个人喜欢使用匿名的委托,因为比较方便。
this.Invoke(new MethodInvoker(delegate()
{
//在这里操作控件
}));
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你想要做什么??this.button1.enabled=false;当然能正常编译
这句是让这个
name为buttion1的按钮不能用
。请问这是线程安全的吗?这句没看懂我语文不好!
我只能说
mayproperty
这个属性的值一直会为10
这句是让这个
name为buttion1的按钮不能用
。请问这是线程安全的吗?这句没看懂我语文不好!
我只能说
mayproperty
这个属性的值一直会为10
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询