C# 多线程 BeginInvoke EndInvoke
委托开启线程
1、调用
private void btnInvoke_Click(object sender, EventArgs e) { Console.WriteLine("开始执行"); Action<string> action = this.Print; // 开启多线程 action.BeginInvoke("hello", null, null); Console.WriteLine("结束执行"); } public void Print(string name) { for (int i = 0; i < 20; i++) { Console.WriteLine($"{i}+{name}"); Thread.Sleep(1000); } }
2、线程结束后,进行后续操作
private void btnInvoke_Click(object sender, EventArgs e) { Console.WriteLine("开始执行"); Action<string> action = this.Print; // callback 方法, ar是boject类型,用来传值 AsyncCallback callback = (ar) => { Console.WriteLine($"object类型的值:{ar.AsyncState}"); Console.WriteLine("执行完线程后调用callback方法"); }; action.BeginInvoke("hello", callback, "你好"); Console.WriteLine("结束执行"); } public void Print(string name) { for (int i = 0; i < 20; i++) { Console.WriteLine($"{i}+{name}"); Thread.Sleep(1000); } }
3、查看线程是否完成(轮询)
private void btnInvoke_Click(object sender, EventArgs e) { Console.WriteLine("开始执行"); Action<string> action = this.Print; IAsyncResult asyncResult = action.BeginInvoke("hello", null, null); while (!asyncResult.IsCompleted) { // 等待2秒进行一次操作 Console.WriteLine("线程没有结束"); Thread.Sleep(1000 * 2); } Console.WriteLine("线程执行结束后的操作"); Console.WriteLine("结束执行"); } public void Print(string name) { for (int i = 0; i < 20; i++) { Console.WriteLine($"{i}+{name}"); Thread.Sleep(1000); } }
4、阻塞一定时间或线程结束后,进行后续操作
private void btnInvoke_Click(object sender, EventArgs e) { Console.WriteLine("开始执行"); Action<string> action = this.Print; IAsyncResult asyncResult = action.BeginInvoke("hello", null, null); // 阻塞2秒后,执行下面的操作,线程依然在执行 // WaitOne()没有值,等待线程执行结束后,再进行操作 asyncResult.AsyncWaitHandle.WaitOne(2*1000); Console.WriteLine("线程执行2秒后的操作"); Console.WriteLine("结束执行"); } public void Print(string name) { for (int i = 0; i < 20; i++) { Console.WriteLine($"{i}+{name}"); Thread.Sleep(1000); } }
5、EndInvoke,等待线程执行继续,进行后面的操作
private void btnInvoke_Click(object sender, EventArgs e) { Console.WriteLine("开始执行"); Action<string> action = this.Print; IAsyncResult asyncResult = action.BeginInvoke("hello", null, null); // 直到线程执行结束,进行下面的操作 action.EndInvoke(asyncResult); Console.WriteLine("线程执行结束后的操作操作"); Console.WriteLine("结束执行"); } public void Print(string name) { for (int i = 0; i < 20; i++) { Console.WriteLine($"{i}+{name}"); Thread.Sleep(1000); } }

浙公网安备 33010602011771号