苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 7631|回复: 8

[其他] 请教有关多线程和winform有关的问题

[复制链接]
发表于 2013-11-17 20:25:48 | 显示全部楼层 |阅读模式
我弄了这么一个玩样....

276db80e7bec54e7d023bc05bb389b504ec26ab4.jpg

当点击“开始执行”的时候会执行下面的代码
ae81fd1f4134970a2b8bb63497cad1c8a6865d86.jpg



不过在我点击“开始执行”的时候时候窗体就卡死了。


有几个问题:


1、窗口为什么卡死。
btn的点击事件不是在另外一个线程运行的吗?而form窗体的显示不是主线程控制的吗?
假设那网页一直没有加载成功,一直在while循环里面。也应该不会响影到主线程控的form窗口的显示吧?那为什么窗体连拖动都不可以?


2、我这样判断网页是否加载成功的方法是不是正确的做法?




1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-11-18 08:17:35 | 显示全部楼层
 楼主| 发表于 2013-11-18 20:52:46 | 显示全部楼层
站长苏飞 发表于 2013-11-18 08:17
请参考我的文章http://www.sufeinet.com/forum.php?mod=viewthread&tid=3556

谢谢,看了您的文章,我有以下几个小问题:

1、我看到您似乎套了两层线程去操作窗体上的文件框。
按钮点击的时候开启了一个线程那个线程里再使用BeginInvoke再开启一个线程。
如果是这样的话,为什么要套两个线程呢?

2、这里还引发一个问题:就是在按钮的点击事件触发的那个线程怎么访问到窗体的BeginInvoke方法,窗跟它不是同个线程吧?

3、我是新手不懂这段代码,简单解释一下可以吗?
delegate{ThreadMethodTxt(Convert.ToInt32(richTextBox1.Text.Trim()));}

发表于 2013-11-18 20:54:26 | 显示全部楼层
可以的,你可以下载看看
 楼主| 发表于 2013-11-18 21:06:12 | 显示全部楼层
站长苏飞 发表于 2013-11-18 20:54
可以的,你可以下载看看

我已经看了,就发现上面那三个问题想不明白。
发表于 2013-11-18 21:13:44 | 显示全部楼层
谁告诉你的BeginInvoke是再开启一个线程,一共就两个线程,一个主的一个一线程用来执行程序的,主线程显示界面这样才不会影响,才不卡
 楼主| 发表于 2013-11-18 21:28:51 | 显示全部楼层
站长苏飞 发表于 2013-11-18 21:13
谁告诉你的BeginInvoke是再开启一个线程,一共就两个线程,一个主的一个一线程用来执行程序的,主线程显示 ...

请问在按钮的点击事件触发的那个线程怎么能访问到窗体的BeginInvoke方法,窗体跟它不是同个线程吧?
发表于 2013-11-19 08:00:47 | 显示全部楼层
[C#] 纯文本查看 复制代码
 //
        // 摘要:
        //     在创建控件的基础句柄所在线程上异步执行指定委托。
        //
        // 参数:
        //   method:
        //     对不带参数的方法的委托。
        //
        // 返回结果:
        //     一个表示 System.Windows.Forms.Control.BeginInvoke(System.Delegate) 操作的结果的 System.IAsyncResult。
        //
        // 异常:
        //   System.InvalidOperationException:
        //     找不到适当的窗口句柄。

在创建控件的基础句柄所在线程上异步执行指定委托

这个方法就是用来异步执行委托的。
当然能访问到了。
就是在创建要访问的控件所在的线程上执行指定的委托,所以就是 在主线程上执行委托来访问窗体控件的

发表于 2013-11-19 08:01:41 | 显示全部楼层
这个你也可以参考更我的例子http://www.sufeinet.com/forum.ph ... on=view&ctid=26
都在上面我的专辑里面
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-29 05:24

© 2014-2021

快速回复 返回顶部 返回列表