winform 防止主界面卡死

时间:2023-03-09 16:30:18
winform 防止主界面卡死

总结网络上的解决方案:新线程=> 委托=> 主界面的异步更新方法(IAsyncResult BeginInvoke(Delegate method)),一句话就是通过委托调用另一个线程的异步方法.

验证方法:当线程执行时,拖拽主窗体,没有卡死迹象.

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms; namespace WinFormInvoke
{
public partial class frMain : Form
{
Invoker Invoker; public frMain()
{
InitializeComponent();
} private void frMain_Load(object sender, EventArgs e)
{
Invoker = new Invoker(AsynUpdateTxtMethod);
} public void UpdateTxtMethod(string msg)
{
tbResult.AppendText(msg + "\r\n");
tbResult.ScrollToCaret();
} public void AsynUpdateTxtMethod(string msg)
{
if (tbResult.InvokeRequired)
{
this.BeginInvoke(new Invoker.CallbackFunc(UpdateTxtMethod), msg);
}
else
{
UpdateTxtMethod(msg);
}
} private void btnStart_Click(object sender, EventArgs e)
{
Invoker.DoThread(int.Parse(tbAmount.Text.Trim()));
}
}
}
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace WinFormInvoke
{
public class Invoker
{
public delegate void CallbackFunc(string msg);
public CallbackFunc AsynCallback; public Invoker(CallbackFunc callback)
{
AsynCallback = callback;
} public virtual void TheadMethod(int amount)
{
this.AsynCallback("线程开始");
for (int i = ; i < amount; i++)
{
this.AsynCallback(i.ToString());
Thread.Sleep();
} this.AsynCallback("线程结束");
} public virtual void DoThread(int amount)
{
Thread t = new Thread(new ThreadStart(delegate
{
TheadMethod(amount);
})); t.Start();
}
}
}

Invoker

winform 防止主界面卡死

Code:  WinFormInvoke.zip