GLDT 是 GNU/Linux 发行版放在时间线上的进化分枝图。
该项目于 2006 年开始,目前列出了超过 450 分布。
|
其他版本:
希望世间永无欺骗
命名空间:System.Threading 程序集:mscorlib(在 mscorlib.dll 中)
C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行。一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多线程创建额外的线程。
1.使用线程的情况
2.多线程的并发执行 如果有多个线程在执行,单CPU只有一个,到底执行的哪个?
3.创建并启动线程
ThreadStart 线程启动委托名=new ThreadStart(方法名);
Thread 线程实例名=new Thread(线程启动委托名); 线程实例名.Start();
4.终止线程
5.休眠线程
6.挂起/恢复线程
7.串行化线程
8.线程的锁定机制 线程的锁定机制可以保证每次只有一个线程可以访问共享资源。 使用关键字lock
9.线程的优先级具有不可靠性,就是说不能用优先级来控制线程的执行顺序。
10.后台线程
Control.CheckForIllegalCrossThreadCalls = False;
要使用MethodInvoker委派,需要三个条件:
Thread thread=new Thread(new ThreadStart(Run)); thread.IsBackground=true; //把Thread设为后台线程 thread.Start();
public void Run() { int count = 0; try { MethodInvoker mi = new MethodInvoker(this.UpdateLabel); //创建一个委托,UpdateLabel是该委托所托管的代码,必须是声明为void 且不接受任何参数的任何方法。 while (true) { count++; //this.Invoke(mi);//同步执行委托 this.BeginInvoke(mi);//异步执行委托 Thread.Sleep(500); } } catch (ThreadInterruptedException e) { Console.WriteLine("Interruption Exception in Thread:{0}", e); } catch (Exception ex) { Console.WriteLine("Exception in Thread:{0}", ex); } }
public void UpdateLabel() { label1.Text=count.ToString(); }
任何线程创建范围内try/catch/finally块,当线程开始执行便不再与其有任何关系。考虑下面的程序:
public static void Main() { try { new Thread (Go).Start(); } catch (Exception ex) { // 不会在这得到异常 Console.WriteLine ("Exception!"); } static void Go() { throw null; } }
这里try/catch语句一点用也没有,新创建的线程将引发NullReferenceException异常。当你考虑到每个线程有独立的执行路径的时候,便知道这行为是有道理的,补救方法是在线程处理的方法内加入他们自己的异常处理:
public static void Main() { new Thread (Go).Start(); } static void Go() { try { ... throw null; // 这个异常在下面会被捕捉到 ... } catch (Exception ex) { 记录异常日志,并且或通知另一个线程 我们发生错误 ... }
从.NET 2.0开始,任何线程内的未处理的异常都将导致整个程序关闭,这意味着忽略异常不再是一个选项了。因此为了避免由未处理异常引起的程序崩溃,try/catch块需要出现在每个线程进入的方法内,至少要在产品程序中应该如此。对于经常使用“全局”异常处理的Windows Forms程序员来说,这可能有点麻烦,像下面这样:
using System; using System.Threading; using System.Windows.Forms; static class Program { static void Main() { Application.ThreadException += HandleError; Application.Run (new MainForm()); } static void HandleError (object sender, ThreadExceptionEventArgs e) { 记录异常或者退出程序或者继续运行... } }
Application.ThreadException事件在异常被抛出时触发,以一个Windows信息(比如:键盘,鼠标活着 “paint” 等信息)的方式,简言之,一个Windows Forms程序的几乎所有代码。虽然这看起来很完美,它使人产生一种虚假的安全感——所有的异常都被中央异常处理捕捉到了。由工作线程抛出的异常便是一个没有被Application.ThreadException捕捉到的很好的例外。(在Main方法中的代码,包括构造器的形式,在Windows信息开始前先执行)
.NET framework为全局异常处理提供了一个更低级别的事件:AppDomain.UnhandledException,这个事件在任何类型的程序(有或没有用户界面)的任何线程有任何未处理的异常触发。尽管它提供了好的不得已的异常处理解决机制,但是这不意味着这能保证程序不崩溃,也不意味着能取消.NET异常对话框。
A couple services have been established for mapping IP numbers to BGP prefixes and ASNs:
Three modes are supported origin, peer, and prefix. The data returned is basically the same except that the peer mode also lists the BGP peers for the ASN.
The data to support these services are collected from the following sources:
The whois interface is used as follows:
$ whois -h asn.shadowserver.org origin 17.112.152.32 714 | 17.112.0.0/16 | APPLE-ENGINEERING | US | APPLE.COM | APPLE COMPUTER INC
The output is as follows
ASN | Prefix | AS Name | CN | Domain | ISP
Using the peer mode is very similar:
$ whois -h asn.shadowserver.org peer 17.112.152.32 3356 7018 | 714 | 17.112.0.0/16 | APPLE-ENGINEERING | US | APPLE.COM | APPLE COMPUTER INC
The output is as follows
Peer(s) | ASN | Prefix | AS Name | CN | Domain | ISP
A more verbose mode is also available:
$ whois -h asn.shadowserver.org peer 4.5.6.4 verbose 3356 | 4.0.0.0/9 | LEVEL3 | US | DSL-VERIZON.NET | GTE.NET LLC 209 ASN-QWEST Qwest 293 ESNET Energy Sciences Network 701 UUNET MCI Communications Services, Inc. d/b/a Verizon Business 702 AS702 Verizon Business EMEA - Commercial IP service provider in Europe 1239 SPRINTLINK Sprint 1668 AOL-ATDN AOL Transit Data Network 2497 JPNIC-ASBLOCK AP JPNIC 2828 XO-AS15 XO Communications 2914 NTT-COMMUNICATIONS-2 NTT America, Inc. 3257 TISCALI BACKBONE Tiscali Intl Network BV 3303 SWISSCOM Swisscom Solutions Ltd 3333 RIPE-NCC AS RIPE Network Coordination Centre 3356 LEVEL3 Level 3 Communications 3549 GBLX Global Crossing Ltd. 3561 SAVVIS Savvis 4513 Globix Corporation 4637 REACH Reach Network Border AS 5459 LINX AS London Internet Exchange Ltd. 5511 OPENTRANSIT France Telecom 6079 RCN-AS RCN Corporation 6395 BROADWING Broadwing Communications Services, Inc. 6453 GLOBEINTERNET VSNL International 6461 MFNX MFN - Metromedia Fiber Network 7018 ATT-INTERNET4 AT&T WorldNet Services 8075 MICROSOFT-CORP---MSN Microsoft Corp 12956 TELEFONICA Telefonica Backbone Autonomous System
$ whois -h asn.shadowserver.org prefix 8075 64.4.0.0/18 65.54.8.0/22 65.54.48.0/20 65.54.74.0/23 65.54.80.0/23 65.54.83.0/24 65.54.86.0/23 65.54.92.0/23 65.54.94.0/23 65.54.96.0/20 65.54.120.0/21 65.54.128.0/19 <<CHOPPED>>
The Whois server also supports batch mode where a list of IP addresses can be handled. For example:
begin origin 4.5.4.3 17.112.152.32 208.77.188.166 end
Use netcat, telnet, or perl to send your list to the whois server:
$ netcat asn.shadowserver.org 43 < /tmp/list 3356 | 4.0.0.0/9 | LEVEL3 | US | DSL-VERIZON.NET | GTE.NET LLC 714 | 17.112.0.0/16 | APPLE-ENGINEERING | US | APPLE.COM | APPLE COMPUTER INC 40528 | 208.77.188.0/22 | ICANN-LAX | - | - | -
The format for a DNS based origin lookup is:
$ dig +short 32.152.112.17.origin.asn.shadowserver.org TXT "714" "|" "17.112.0.0/16" "|" "APPLE-ENGINEERING" "|" "US" "|" "APPLE.COM" "|" "APPLE" "COMPUTER" "INC"
And the format for a ”peer’ lookup is:
$ dig +short 32.152.112.17.peer.asn.shadowserver.org TXT "3356" "7018" "|" "714" "|" "17.112.0.0/16" "|" "APPLE-ENGINEERING" "|" "US" "|" "APPLE.COM" "|" "APPLE" "COMPUTER" "INC"
http://www.shadowserver.org/wiki/pmwiki.php/Services/IP-BGP
Other Res : BGP Monitoring http://www.team-cymru.org/Monitoring/BGP/
在写一个工具, 其中一个功能是检测收集服务器的一些信息, 需要在一个操作中取到HTTP headers 信息和 页面的标题(title).
尝试了WebRequest,WebResponse和 HttpWebRequest,HttpWebResponse. 研究他们的不同, 有Http的提供 了对无Http类的 HTTP 特定方法的实现. 关键似乎找不到我的要求”在一次操作中”完成获取到HTTP headers 和 title.
最后突然看到了一段国外代码中用到WebClient, 虽然功能不尽相同, 但又多了一点思路. 进行一翻测试, 发现WebClient十分简便好用, 代码量也骤减. 虽然效率可能会略慢一些,但是做到了一次调用, 取到headers 和 title.
代码如下:
//方法函数 /// <summary> /// 返回 HTTP headers. /// </summary> /// <param name="Url">地址</param> /// <returns>headers的列表</returns> public Dictionary<string, string> GetHTTPResponseHeaders(string url) { Dictionary<string, string> HeaderList = new Dictionary<string, string>(); WebClient x = new WebClient(); x.Headers.Set("Timeout", "6000"); //超时设置6秒 string source = x.DownloadString(url); //用正则表达式取页面标题 string title = Regex.Match(source, @"<titleb[^>]*>s*(?<Title>[sS]*?)</title>", RegexOptions.IgnoreCase).Groups["Title"].Value; HeaderList.Add("Address", url); //加入地址 HeaderList.Add("Title", title); //加入页面标题 foreach (string HeaderKey in x.ResponseHeaders) HeaderList.Add(HeaderKey, x.ResponseHeaders[HeaderKey]); return HeaderList; } //调用 void Button2Click(object sender, EventArgs e) { Dictionary<string, string> Headers = GetHTTPResponseHeaders("http://www.bohu.cn/"); foreach (string HeaderKey in Headers.Keys) textBox5.Text += HeaderKey+" : "+Headers[HeaderKey]+"rn"; }