winform跨线程更新ui C# winform多线程异步更新UI?
C# winform多线程异步更新UI?
首先,在窗口上放置一个按钮和一个图片框(图片框可见为假)。这个多线程的目的是点击按钮,图片就会正常运行。另一个线程将在休眠10秒后执行。
private void button1_uu1;Click(object sender,EventArgs E)
{
//启动线程系统线程线程=新系统线程(新建)System.Threading.ThreadStart( 这个。结果))
pictureBox1.Visible=true
按钮1.Enabled=false线程。开始()
}
私有void Result()
{
bool好的=这个。你知道吗()
这个。开始唤醒(新建)System.Threading.ThreadStart(delegate()
{
if(确定)MessageBox.显示(“success”、“prompt”
否则MessageBox.显示(“fail”,“prompt”)。可见=假
按钮1。Enabled=true
}
!]private bool do()
{系统线程.Sleep(10000)
return True
winform更新UI控件的时间过长导致假死?
您可以使用多线程,并委派创建控件的线程来更新控件。
如果(datagridview1。InvokeRequired){//确定当前线程是否必须调用invoke来更新控件datagridview1。Invoke(new action(()=>{//委托创建控件的线程来更新控件datagridview1。背景颜色=颜色:黑色//更新控件操作})}
非UI线程无法更改UI控件内容(由于安全限制)。
因此,当您想用子线程(非UI线程)更改UI控件的内容时,必须使用委托(您想做的),然后让控件执行委托本身。所以很安全。
C#为什么多线程控制winform需要用委托?
有两种简单的方法可以解决此问题。
1. 使用多线程,把ckbind处理放到子线程中,它不会影响主窗口对系统事件的响应,它也不会没有响应,如果你想的话,你也可以使主窗口不可用,然后添加一个进度条,让人们知道一个长进程正在执行,程序还在运行。
2. 在ckbind中,如果循环引起的事件太长,则可以在循环有固定次数时调用它应用程序.DoEvent()方法使程序能够对系统事件响应一次。虽然不能看到程序移动,但它不会没有响应。因为系统判断无响应是指程序在一定时间内无法对系统事件做出响应,所以在此时间之前它只响应一次,就不存在响应问题。
winform跨线程更新ui winform多线程打开另外窗体 winform多线程例子
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。