怎么让子线程结束后继续主线程? 我想知道是方法还是事件呢?首先如果像我这么写的话 fenxi(data)就不会停住会在线程下载的时候直接就运行了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ManualResetEvent wait = new ManualResetEvent(false);Main(){ wait.WaitOne();}void Run(){..... wait.Set();} 这个怎么会可以呢?WaitOne()一直要等到Set()之后才会继续下面的操作,等于被阻塞。应该用异步来实现。最简单的是winform里的backgroundworker,在Completed事件中可进行fenxi(data); 确实啊我发现了程序UI卡死了怎么办呢?我做的WPF 是不是也有backgrounder 应该可用,参考:http://www.ryanvice.net/wpf-3-5/using-backgroundworker-with-wpf/ 这是.net框架基本组件,在各种子平台下都有backgroundworker。假设你使用WaitHandler阻塞,那么你应该首先启动一个线程,这个线程再去分别启动两个download线程,并阻塞。而不能在主线程中有任何阻塞代码。假设你精简地、不用任何阻塞,那么应该在两个download线程中每一个调用方法的最后,会掉一个fenxi方法。然后这个分析方法首先判断是否下载结束,例如lock(downloadList){ downloadList.Remove(thisMethodFlag); if(downloadList.count==0) 真正开始分析();}每一个download过程再结束时都去调用fenxi方法判断是否“下载任务集合”已经为空,如果不为空,就什么也不做;只有为空,才开始真正去分析。这样,不需要占用一个线程的资源去搞阻塞, 不要纠结于“继续主线程”这个词儿!你的fenxi方法不一定执行在哪一个线程中,完全可以使用某一个download所使用的线程。假设你之前的观念就是“一定要在主线程中执行”,那么就纠结了。实际上,任何计算工作都无需主线程去执行(当然无不是说就必须使用子线程)。如果你这样去设计程序,就可以选择最为恰当的流程。 其实我是在设计一个下载,然后下载完成以后让用户去选择是否继续,但是必须要等待下载完成才行。我下载用的是backgroundworker。有一个问题是 我的函数已经封装好了比如是: private void bw_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; Search_Net sn = new Search_Net(); Vars.name.Clear(); Vars.link.Clear(); sn.google(content); }其中sn.google是一个比较耗时的函数,比如google100个页面,每增加一个progressbar +1的话bw_ProgressChanged是不是就不好用了应该怎么实现呢? 是啊,我自己都乱了在线抓取数据,抓取时前台不死机,后台运行并有progrebar显示完成后给出提示,比如MessageBox. 后台线程连接数据库,照样界面假死? 在用C#编写的asp.net 网站中,可以使用asp脚本(vb编写的)吗? 如果按照年份进行编号~ 关于启动窗口的问题 自定义控件中使用的资源路径问题 难题:怎么用代码动态探测遍例列出C# Class里的各个可访问的参数名和值? 请问openwaver不支持aspx后缀怎么办?? EF5 查询不想用缓存,怎么实现? 请问怎么在pictureBox中加scrollbar呢? 谁能给写一个判断当前日期是今年的第几个星期的代码? 一段C#代码,求改错 WinForm中什么控件用来显示信息
Main()
{
wait.WaitOne();
}void Run()
{.....
wait.Set();
}
应该用异步来实现。最简单的是winform里的backgroundworker,在Completed事件中可进行fenxi(data);
怎么办呢?
我做的WPF 是不是也有backgrounder
这是.net框架基本组件,在各种子平台下都有backgroundworker。假设你使用WaitHandler阻塞,那么你应该首先启动一个线程,这个线程再去分别启动两个download线程,并阻塞。而不能在主线程中有任何阻塞代码。假设你精简地、不用任何阻塞,那么应该在两个download线程中每一个调用方法的最后,会掉一个fenxi方法。然后这个分析方法首先判断是否下载结束,例如lock(downloadList)
{
downloadList.Remove(thisMethodFlag);
if(downloadList.count==0)
真正开始分析();
}
每一个download过程再结束时都去调用fenxi方法判断是否“下载任务集合”已经为空,如果不为空,就什么也不做;只有为空,才开始真正去分析。这样,不需要占用一个线程的资源去搞阻塞,
我下载用的是backgroundworker。有一个问题是 我的函数已经封装好了
比如是:
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
Search_Net sn = new Search_Net();
Vars.name.Clear();
Vars.link.Clear();
sn.google(content);
}
其中sn.google是一个比较耗时的函数,比如google100个页面,每增加一个progressbar +1的话
bw_ProgressChanged是不是就不好用了
应该怎么实现呢?
在线抓取数据,抓取时前台不死机,后台运行并有progrebar显示
完成后给出提示,比如MessageBox.