我在评论区域“悬挂表单”
中的此代码中存在问题我的节目会挂在那里!!!!什么是问题?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; namespace WindowsFormsApplication28 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } BackgroundWorker backgw = new BackgroundWorker(); private void button1_Click(object sender, EventArgs e) { backgw.DoWork += new DoWorkEventHandler(k_DoWork); ParameterizedThreadStart start = new ParameterizedThreadStart(startthread); System.Threading.Thread u; int i = 0; while (i < 100) { //u = new System.Threading.Thread(start); //u.Start(i); //1.with thread way backgw.RunWorkerAsync(i); //2.with backgw way Thread.Sleep(1000); lock (y) { Thread.Sleep(1000); } lock(h) i++; } } delegate void j(int h); j b; object h = new object(); object y = new object(); void startthread(object m) { Monitor.Enter(h); Monitor.Enter(y); p1((int)m); Monitor.Exit(h); } void p1(int h) { b = delegate(int q) { label1.Text = string.Format("Step is :{0}", h.ToString()); }; Monitor.Exit(y); label1.Invoke(b); //hang the form???? } void k_DoWork(object sender, DoWorkEventArgs e) { Monitor.Enter(h); Monitor.Enter(y); p1((int)e.Argument); Monitor.Exit(h); } } }
答案 0 :(得分:0)
Invoke等待函数返回。 UI线程将运行循环几分钟,工作线程将等待UI线程调用并返回。
使用BeginInvoke将任务放在UI线程上而不会阻塞。