在C#中跨线程访问Winform控件
在程序需要读取CAD文件列表中的文件信息,这是一个非常费时的操作,所以希望通过多线程的方式来实现,并且可以随时中止。由于初次使用多线程,开始的时候采用独立的线程类,该类返回数据,在Thread.Join()方法等待线程结束后写入数据到窗体控件中,结果和单线程没有什么区别;后来查看资料通过使用MethodInvoker解决了这一问题,但是对于线程处理还是概念非常模糊,大家谁有这方面的心得、资料等共享学习学习。
public partial class frmMain : Form
{
private volatile bool _stoped = false;

private void btFilter_Click(object sender, EventArgs e)
{
_stoped = false;
Thread t = new Thread(new ThreadStart(StartNewThread));
t.Start();
}

private void btStop_Click(object sender, EventArgs e)
{
_stoped = true;
}

private void GetFileSize()
{
btFilter.Enabled = false;
using (AutoCADConnector CAD = new AutoCADConnector())
{
foreach (ListViewItem t in lvSource.Items)
{
if (!_stoped)
{
AutoCAD.AcadDocument doc = CAD.Application.Documents.Open(t.SubItems[2].Text, true, "");

double[] p1 = new double[] { 0, 0, 0 }; //右上角坐标
double[] p2 = new double[] { 0, 0, 0 }; //左下角坐标
double scale = 0; //缩放比例

p1 = (double[])doc.GetVariable("EXTMAX");
p2 = (double[])doc.GetVariable("EXTMIN");
scale = Convert.ToDouble(doc.GetVariable("DIMSCALE"));

double w = Math.Ceiling((p1[0] - p2[0]) / scale);
double h = Math.Ceiling((p1[1] - p2[1]) / scale);

doc.Close(false, "");

t.SubItems[1].Text = string.Format("{0}*{1} {2}", w, h, scale);
//lvSource.Refresh();
//Thread.Sleep(100);
Application.DoEvents();
}
else
break;
}
}
btFilter.Enabled = true;

}

private void StartNewThread()
{
MethodInvoker me = new MethodInvoker(this.GetFileSize);
this.BeginInvoke(me);
}

}




























































【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现