(一)带参数的线程启动
thread = new Thread(new ParameterizedThreadStart(login));
thread.SetApartmentState(ApartmentState.STA);
string tmp = taskname;
thread.Start(tmp);
public void login(object taskname)
{
myset.Reset();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
foreach (string id2 in forumids)
{
ds = dm.getsql("select FORUMID from BBSFB2 WHERE ID=" + id2 );
string forumid = ds.Tables[0].Rows[0][0].ToString();
webBrowser1.BeginInvoke(new ClientDelegate(delegate
{
//WebBrowser wb = initWebBrower();
string URL = String.Format(loginurl, forumid);
webBrowser1.Navigate(new System.Uri(URL, System.UriKind.Absolute));
}));
myreset.WaitOne(20000);
}
}
(二)线程之间的操作:
private static ManualResetEvent myset = new ManualResetEvent(false);
//其中参数false表示当第一次执行到WaitOne() 时并不停止 而是在第二次的时候停止 相反为true时则遇到WaitOne()就停止
myreset.WaitOne(20000);//停止直到遇到 myreset.Set();开始或20秒后开始,防止死锁
(三)线程之间lock:
public static object syncRoot = new object();
lock( syncRoot )
{ }//在这个区间,实际就是一个临界区。。