WinForm的Task任务里面怎么样给主窗体UI赋值

.Net技术 码拜 5年前 (2016-06-03) 434次浏览
//登录功能
private void btn_Login_Click(object sender, EventArgs e)
{
Task t = new Task(() =>
{
if (string.IsNullOrEmpty(this.txtUserName.Text))
{
this.Error_UserName.Visible = true;                                  //这里怎么样设置主窗体Lable的值为显示啊
return;
}
else
{
this.Error_UserName.Visible = false;
}
}
解决方案

5

Action act = () =>
{
if (string.IsNullOrEmpty(this.txtUserName.Text))
{
this.Error_UserName.Visible = true;                                  //这里怎么样设置主窗体Lable的值为显示啊
return;
}
else
{
this.Error_UserName.Visible = false;
}
};
Task t = new Task(() =>
{
if(this.InvokeRequired)
this.Invoke(act);
else
act();
});

5

要么委托UI线程,要么关掉控件跨线程检测

2

this.invoke(),去查

1

1楼已经告诉你正确方法了,非UI线程对窗口UI操作用Invoke就行了。

1

1楼正解,Invoke方法

5

引用:

本人的例子举的有点不太好,本人Task里面其实是要进行远程一个耗时的登录检测,然后在根据返回结果来判断能否要显示Error信息的。所以假如要在Task里面对主窗体UI控制,应该怎么弄才对?

不要在 task 里控制 ui
enum errorcode { none, usernotexists, passwordError, … }
Task<errorcode> act { 登录验证 }
var code = await act();
根据 code 执行 ui 反馈

2

得显式invoke否则不在一个线程问题

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明WinForm的Task任务里面怎么样给主窗体UI赋值
喜欢 (0)
[1034331897@qq.com]
分享 (0)