C# winform多线程案例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# winform多线程案例相关的知识,希望对你有一定的参考价值。

最近在做基于C#的AutoCAD的二次开发,用dll封装了一个CAD命令程序类,需要从这个dll中取出一个值,但是如果这个值在dll里赋了初值的话,可以取到这个初值。但是如果用CAD命令为其赋值的话,在CAD里面可以看到这个值,winform窗体上取不到这个值,应该是多线程间通信的问题。(我要取的是代码中dis的值)
附上CAD命令
[CommandMethod("getDistance")]
public static void GetDistance()

PromptDistanceOptions prDistOptions = new PromptDistanceOptions("计算两点距离,请选择第一个点:");
PromptDoubleResult prDistRes;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
prDistRes = ed.GetDistance(prDistOptions);
dis = prDistRes.Value.ToString();
ed.WriteMessage("dis=" + prDistRes.Value.ToString());

想问一下大家,有什么好的解决方案。
谢过!!!

参考技术A 热,小伙子,不要乱搞啊,多线程在CS里面,都是一个主线程跑UI,然后其他的线程拿到值以后只能通过委托的方式让主线程去更新UI的值,你以为呢,创建UI控件的时候,控件或者其他对象会记录该线程的ID,以后只能被这个id的线程操作。小伙子你在干什么纳,多线程要注意生存周期,自己去画图分析吧,注意同步的问题。用匿名委托能减少很多代码量,因为函数变量可以在两个里面通用。哎不说了,慢慢吧追问

阁下以为我的问题怎么解决才好?

追答

上面只是说CS多线程是怎么写的, 总体看你的问题是想问数据在代码中已经被复制了,而UI却拿不到那个值,首先你算出来的值跟新到UI是需要用 UI主线程去INVOKE的,这样才能附上。这里可能有问题,另外检查是不是该变量在去给UI线程跟新前 被其他线程重新赋值了,我不知道你的具体问题是什么,我也做过几个CS的项目, 遇到过赋值的问题,具体还是得自己搞把,多线程不好DEBUG所以要有耐心 ,不知道你对多线程机制熟悉不,如果多去看看线程.INVOKE和控件.INVOKE等等,会对你理解代码有帮助的。

参考技术B 如果是线程之间的通信的问题的话,可以用个线程指定的委托Invoke估计行,你看看是不是其他原因 参考技术C 你那段代码能跑通么?

我不确定。。。。

你可以在下面写 Form1 f=new form1(dis)
f。show();

定义的时候你定义 Form1(string s)

C#多线程等待回调

参考技术A 此处介绍一下 AutoResetEvent的方法

下面贴一下微软自带的一个方法。

这样点击后就是

sleep十秒后

我们会注意到里面有个方法

此处这个方法可以替换带参数启动一个new Thread。 上面这个方法已经非常简练,建议这么使用,下面这个方法挺繁琐的。
下面的方法其实也是带参数新建线程的一个方法。

我们先新建一个类

那么将原先工程中的替换一下

以上是关于C# winform多线程案例的主要内容,如果未能解决你的问题,请参考以下文章

C# winform 多线程更新数据,UI卡顿现象。

一个C# (队列多任务+多线程处理)对象的winform demo

我用C# winform多线程,窗口就假死,等到线程全部完成了才可以点击。请问要怎么才可以让窗口不假死。

C# Winform 多线程异步委托进度条

Winform c# 多线程处理实例 地址 可以下载!

Winform c# 多线程处理实例 地址 可以下载!