WinForm多线程问题? .NETWinFormC#多线程委托 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Thread thread = new Thread(new ThreadStart(dm)): Thread.Start();void dm(){ this.Invoke(new Action(delegate() { this.txtName.Enabled = true; }));}不如试试这个 private void SetStatus() { this.txtName.Invoke(new MethodInvoker(() => this.txtName.Enabled = true)); } 试过了,可行,但是实际上我在SetStatus()方法内,操作的不止是一个控件,用这个方法就有点麻烦了... 在非UI线程中操作UI会报错,可使用Invoke 可是我代码里使用到委托并Invoke了啊,难道用法不对? 1.你代码编译不能通过2.IsHandleCreated 是什么意识你不知道3Control.Invoke(..);Control.BeginingInoke(..) 在什么情况下调用你不知道IsHandleCreated 是说你的窗体空间已经初始化了(被创建),防止在创建窗口之前调用invoke() private delegate void DelegateMethod(); private void button1_Click(object sender, EventArgs e) { DelegateMethod dm = delegate() { SetStatus(); }; if(!IsHandleCreated) { this.textBox1.Invoke(dm); } this.textBox1.Invoke(dm); Thread thread = new Thread(new ThreadStart(dm)); thread.Start(); } private void SetStatus() { this.textBox1.Enabled = false; //报错,从不是创建此控件的线程访问。 } private delegate void DelegateMethod(); private void button1_Click(object sender, EventArgs e) { DelegateMethod dm = delegate() { SetStatus(); }; if(IsHandleCreated) this.textBox1.Invoke(dm); Thread thread = new Thread(new ThreadStart(dm)); thread.Start(); } private void SetStatus() { this.textBox1.Enabled = false; //报错,从不是创建此控件的线程访问。 } 1、你说我代码编译不能通过,可能是 thread.Start() 我写成了 Thread.Start()2、我看了你的代码,你Invoke了两次,这样好像不行吧,SetStatus()内的代码回执行两次... 1、你说我代码编译不能通过,可能是 thread.Start() 我写成了 Thread.Start()2、我看了你的代码,你Invoke了两次,这样好像不行吧,SetStatus()内的代码回执行两次...下面的个才是你没看到吗? 我是来挣分的(无奈我自己的分太少啊),代码如下:private delegate void DelegateMethod(); private void SetStatus(){ this.txtName.Enabled = true; //报错,从不是创建此控件的线程访问。} public void btnStart_Click(object sender,EventArgs e){ DelegateMethod dm = new DelegateMethod(SetStatus); { SetStatus(); }; if(!IsHandleCreated) { this.txtName.Invoeke(dm); } Thread thread = new Thread(new ThreadStart(dm)); thread.Start(); } if(!IsHandleCreated) 改成 if(IsHandleCreated) 我写错了,应该是private delegate void DeleagetMethod(); 我写错了,应该是:private delegate void DelegateMethod(); DelegateMethod dm = new DelegateMethod(SetStatus); { SetStatus(); };这几句代码从字面上看,是相当于执行了两次SetStatus();,为什么要这么做呢? 我试过了刚刚,可行,但是我还是不太明白我写的代码究竟是什么原因才会报那个异常...你的这个代码就是没有执行 Invoke。private void SetStatus(){ this.txtName.Enabled = true; //报错,从不是创建此控件的线程访问。} public void btnStart_Click(object sender,EventArgs e){ DelegateMethod dm = delegate() { SetStatus(); }; Thread thread = new Thread(new ThreadStart(dm)): Thread.Start(); } 你两个地方调用了它,第二次写错了。我就调用了一次呀 if(!IsHandleCreated) { this.txtName.Invoeke(dm); } 能否在一条sql语句中,增删改的同时,还能获取所操作的行的ID(主键) ERP开发 全云鹏进来求解一下 调用一个delphil DLL的接口,接口中有一个 _Recordset 的类型,如何使用阿,找不到类型或命名空间名称“Recordset”(是否缺少 using 指令或 Thread.Sleep()系统时间的问题 文件属性问题 〓〓〓如何在repeater_ItemCommand()中获得当前行的字段值?〓〓〓 关于|与||的区别与应用 C#的声音播放 怎么样做一个象QQ一样的在任务栏中显示图标当有信息时候闪动? 数据库同步问题 如何减少程序第一次运行时间?
Thread thread = new Thread(new ThreadStart(dm)):
Thread.Start();void dm()
{
this.Invoke(new Action(delegate() {
this.txtName.Enabled = true;
}));
}不如试试这个
private void SetStatus()
{
this.txtName.Invoke(new MethodInvoker(() => this.txtName.Enabled = true));
}
试过了,可行,但是实际上我在SetStatus()方法内,操作的不止是一个控件,用这个方法就有点麻烦了...
可是我代码里使用到委托并Invoke了啊,难道用法不对?
2.IsHandleCreated 是什么意识你不知道
3Control.Invoke(..);Control.BeginingInoke(..) 在什么情况下调用你不知道IsHandleCreated 是说你的窗体空间已经初始化了(被创建),防止在创建窗口之前调用invoke() private delegate void DelegateMethod();
private void button1_Click(object sender, EventArgs e)
{
DelegateMethod dm = delegate()
{ SetStatus();
};
if(!IsHandleCreated)
{
this.textBox1.Invoke(dm);
}
this.textBox1.Invoke(dm);
Thread thread = new Thread(new ThreadStart(dm));
thread.Start();
}
private void SetStatus()
{
this.textBox1.Enabled = false; //报错,从不是创建此控件的线程访问。
}
private void button1_Click(object sender, EventArgs e)
{
DelegateMethod dm = delegate()
{ SetStatus();
};
if(IsHandleCreated)
this.textBox1.Invoke(dm);
Thread thread = new Thread(new ThreadStart(dm));
thread.Start();
}
private void SetStatus()
{
this.textBox1.Enabled = false; //报错,从不是创建此控件的线程访问。
}
1、你说我代码编译不能通过,可能是 thread.Start() 我写成了 Thread.Start()
2、我看了你的代码,你Invoke了两次,这样好像不行吧,SetStatus()内的代码回执行两次...
1、你说我代码编译不能通过,可能是 thread.Start() 我写成了 Thread.Start()
2、我看了你的代码,你Invoke了两次,这样好像不行吧,SetStatus()内的代码回执行两次...
下面的个才是你没看到吗?
private delegate void DelegateMethod();
private void SetStatus()
{
this.txtName.Enabled = true; //报错,从不是创建此控件的线程访问。
}
public void btnStart_Click(object sender,EventArgs e)
{
DelegateMethod dm = new DelegateMethod(SetStatus);
{
SetStatus();
};
if(!IsHandleCreated)
{
this.txtName.Invoeke(dm);
} Thread thread = new Thread(new ThreadStart(dm));
thread.Start();
}
我写错了,应该是private delegate void DeleagetMethod();
我写错了,应该是:private delegate void DelegateMethod();
{
SetStatus();
};
这几句代码从字面上看,是相当于执行了两次SetStatus();,为什么要这么做呢?
private void SetStatus()
{
this.txtName.Enabled = true; //报错,从不是创建此控件的线程访问。
}
public void btnStart_Click(object sender,EventArgs e)
{
DelegateMethod dm = delegate()
{
SetStatus();
};
Thread thread = new Thread(new ThreadStart(dm)):
Thread.Start();
}
你两个地方调用了它,第二次写错了。我就调用了一次呀
if(!IsHandleCreated)
{
this.txtName.Invoeke(dm);
}