摘要: 采用SqlServer2000+asp.net2.0+SubSonic+Linq+AspNetPager分页控件的自家用的站点程序(含源码)
阅读全文
按照惯例先上个图,自己照着人家的例子写了一遍,基本上把这个弄懂了,这个控件就是省事,不懂线程原理的人也可使,ms就是厉害,生产力节节提高哈,

1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Linq;
7
using System.Text;
8
using System.Threading;
9
using System.Windows.Forms;
10
11
namespace BrowserDemo
12

{
13
public partial class Form7 : Form
14
{
15
const int argument = 20000;
16
17
public Form7()
18
{
19
InitializeComponent();
20
}
21
22
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
23
{
24
for(var i=0;i<int.Parse(e.Argument.ToString());i++)
25
{
26
e.Result = i;
27
(sender as BackgroundWorker).ReportProgress((int)(((double)i / (double)((int)e.Argument)) * 100),i);
28
Thread.Sleep(20);
29
if (this.backgroundWorker1.CancellationPending)
30
return;
31
}
32
}
33
34
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
35
{
36
this.listBox1.Items.Add(e.UserState);
37
this.progressBar1.Value = e.ProgressPercentage;
38
}
39
40
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
41
{
42
MessageBox.Show("finished");
43
}
44
45
private void button1_Click(object sender, EventArgs e)
46
{
47
if (this.backgroundWorker1.IsBusy)
48
{
49
MessageBox.Show("慢则那,等着吧");
50
return;
51
}
52
this.backgroundWorker1.RunWorkerAsync(argument);
53
this.button2.Enabled = true;
54
this.button3.Enabled = true;
55
56
}
57
58
private void button2_Click(object sender, EventArgs e)
59
{
60
MessageBox.Show("111");
61
}
62
63
private void button3_Click(object sender, EventArgs e)
64
{
65
this.backgroundWorker1.CancelAsync();
66
}
67
68
private void Form7_Load(object sender, EventArgs e)
69
{
70
this.button2.Enabled = false;
71
this.button3.Enabled = false;
72
}
73
}
74
}
75
完整的工程如下
http://files.cnblogs.com/lexus/BrowserDemo.7z
相关资源,发现msdn上写得比较还好,不过自己写一遍自己就清楚了,我发现网上的msdn,是不是和vs2008里的光盘里的那个msdn不一样,有些资源为什么在光盘上的找不到呢,等我采集程序做好了,我要把它都抓下来,占为已有,嘿嘿
http://msdn.microsoft.com/zh-cn/library/ms233672(VS.80).aspx
log4net是一个apache基金资助的项目log4j的.net移植版本,它是一个.net的dll,可以方便的加载到开发项目中,实现程序调试和运行的时候的日志信息输入,比.net自己提供的debug类和trace类要提供更多功能。
整个讨论分为两部分,第一部分是howto部分,告诉读者如何用最快的方式使log4net运作起来,第二步部分是inside部分,和读者一起探讨关于log4net层次架构设计以及一些思想.
HOWTO部分:
该部分给出一个范例,让你的第一个log4net范例尽快运行起来
先决条件:作者假设用户能够使用visual studio 2003的ide编写.net的winform程序,以及用户已经从网站上下载了一份最新的log4net(当前最新版本的下载地址:http://cvs.apache.org/dist/incubator/log4net/1.2.9/incubating-log4net-1.2.9-beta.zip)
第一步:新增项目,添加log4net引用.
通过vs.net 2003建立一个项目,然后将log4net添加到项目引用中来
第二步:设置配置文件:
建立对应项目的xml配置文件,log4net.config,文件内容如下:
1<?xml version="1.0" encoding="utf-8" ?>
2<configuration>
3 <configSections>
4 <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
5 </configSections>
6 <log4net>
7 <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
8 <layout type="log4net.Layout.PatternLayout">
9 <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
10 </layout>
11 </appender>
12 <appender name="FileAppender" type="log4net.Appender.FileAppender">
13 <file value="c:/log-file.txt" />
14 <appendToFile value="true" />
15 <layout type="log4net.Layout.PatternLayout">
16 <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
17 </layout>
18 </appender>
19 <root>
20 <level value="INFO" />
21 <appender-ref ref="ConsoleAppender" />
22 </root>
23 <logger name="test.logger">
24 <level value="ALL" />
25 <appender-ref ref="FileAppender" />
26 </logger>
27 </log4net>
28</configuration>
第三步:在程序中设置自动加载以及监视配置文件
在AssemblyInfo.cs中增加如下语句:
1[assembly: log4net.Config.XmlConfigurator(Watch=true,ConfigFile="log4net.config")]
第四步:测试使用
在窗体中增加一个按钮,
并在该按钮的Click事件中增加如下代码:
private void trigLogger_Click(object sender, System.EventArgs e)
{
ILog log = LogManager.GetLogger("test.logger");
log.Info("Hello,World!");
}
然后首先将log4net.config复制到bin\Debug目录下,并运行程序,点击"Trigger Logger"按钮,可以看到结果大概 如下
2006-01-19 16:25:54,890 [3476] INFO Test.logger [(null)] - Hello World
依旧先来段废话呵呵,程序还在开发阶段,担心开发出来的程序会走样,所以拿出来溜溜。市面上已经有n多的采集软件了,我只是在重复轮子,比它们的好不到哪去,差到没边到是极有可能。不过相比目前的一些采集程序而言,我算是基于组件的吧,各个组件间可替换,希望能算得上是一个亮点。同时也希望这次的展示,同行专家们给予建议和批评。
目前没有解决的问题是:
1.一些需要cookie的网站,怎么采集,sina我是登录进去了,不过cnblogs我没有登录成功。
2.定时的执行,怎么样让一个任务定时执行,使用Quartz.net?,由于一个采集任务的网址可能非常之多,第一个网址采集的时间,和最后一个网址采集的时间可能相隔几小时,如果整个任务的要求是间隔1h,采集一次,那么最后一个网址可能才刚采集完又要采集了,或是上一次任务都还没有执行到该网址。这里还没有考虑采集间隔策略的情况,比如如果三次采集未发生变化则延长下次采集时间等
3.储存问题,如果使用DAS、或是数据库到是一点问题都没有,但是如果各个客户端将采集的结果以文件的形式储存,怎么将各客户机上的文件汇总合并又将是一个系统的工程
4.任务流程及组件的装配界面实现的问题,目前对流程的配置都是使用文本编辑器来编辑配置文件,极易写错,对GDI+不了解,没有想到好的方法来实现界面化的组件装配。
我们先来看一下采集的结果,再介绍整个采集的流程。采集的结果用xml保存,使用了程序内置的Store2Xml组件,如果你想储存到特定的数据库中,你可以自己写一个组件,或者提供某个cms的webservice我们再做一个适配组件。
我考虑再做一个Store2MDB的组件,便于将数据转移也是嵌入式的,不采用sqlite是因为一般用户可能不太了解。
下面我以采集http://tech.sina.com.cn/VC/index.html下的创业资讯和创业锦囊栏目为例,展示一下这个程序
step1:分析网页
这两个栏目的样式是一样的,因此我们只需要写一个采集规则就可以了。
打开任意一个栏目的列表页,查看它的源码,我们需要找到重复的片段,如下图中高亮的部分是重复出现的内容

我们将上图中的欲抽取的部分源码放到RegexBuddy中作为测试代码,用来测试我们撰写的正则

将测试完的正则放到组件的指定属性中,目前只能手工配置了,在实际中应用有一个图形化的环境,提供step by step的操作提示

最后我们来设计组件装配置执行的流程,使用的是boo解释引擎,类似ironpython

在设计阶段总共有三个文件 ,其中文本文件储存的是欲采集的网址集,一行一个

Step 2:添加任务
将设计阶段制作好的任务包添加进来,填写好信息,就可以提交任务了<