多线程下调用类的使用问题

CrazyCode1981 2012-09-10 10:40:52
http://topic.csdn.net/u/20120910/10/9d3eb9bc-09ce-44cd-af7c-09d0585a7cf3.html 同一个问题,另开贴子问,这里我重新整理了下,希望能有人帮下我的忙,全部分就这些了....

主窗体的代码:

WorkThread = new Thread(Start);
WorkThread.SetApartmentState(ApartmentState.STA);
WorkThread.Start();

private void Start()
{
for (int i = 0; i < BookList.Items.Count; i++)
{
string MarcIntroduction = BookList.Items[i].SubItems[4].Text.Trim();

HtmlM.Html(MarcIntroduction);
}
}


HtmlM类代码
public bool Html(string BBe)
{
try
{
//省略部分无关代码

WebBrowserClass WBC = new WebBrowserClass();
WBC.StartWebBrowser(DetailsPageUrl);//** 使用WebBrowser控件方式获取Html
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + System.Reflection.MethodInfo.GetCurrentMethod().Name);
return false;
}
}

上面红字部分调用下面类

class WebBrowserClass
{
WebBrowser myWebPage = new WebBrowser();
Timer Monitor = new Timer();

public WebBrowserClass()
{

}

public void StartWebBrowser(string Url)
{
myWebPage.ScrollBarsEnabled = true;
myWebPage.ScriptErrorsSuppressed = false;
myWebPage.Navigate(Url);
Monitor.Interval = 3000;
Monitor.Tick += new EventHandler(Monitor_Tick);
Monitor.Start();
//出现问题的地方 在HtmlM类中实例化以后调用这个类 这里的Monitor.Start()以后 下面的Monitor_Tick一直没有触发 这是为何?
}


private void Monitor_Tick(object sender, EventArgs e)
{
if (myWebPage.IsBusy == false && myWebPage.StatusText == "完成")
{
BookInfor.StaticClass.WebPageHtml = myWebPage.Document.Body.OuterHtml;
BookInfor.StaticClass.flag = true;
Monitor.Stop();
}
}


}

...全文
159 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
CrazyCode1981 2012-09-11
  • 打赏
  • 举报
回复
但是换了Timer以后 又出现问题了 我新开贴问题吧。。。
CrazyCode1981 2012-09-11
  • 打赏
  • 举报
回复
3楼说的对。
查了下资料 TImer有3种 我用的这个Timer必须在窗体中使用
qldsrx 2012-09-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
哦。。。
突然想到你这个问题是怎么回事了。
你用的这个Timer是名字空间System.Windows.Forms.Timer下的,这个Timer只能在单线程中使用。但是你上面的代码,却是一个Thread里面启用的,所以不行。

你可以把那个Timer换成System.Timer.Timer;
即用显示标注Timer。

using Timer = System.Timers.Tim……
[/Quote]
不是不支持多线程,而是必须有消息循环,也就是说,如果是控制台程序,即使单线程也不能用它。必须是在Form的内部使用,必须有窗口接收Windows消息,和是否多线程毫无关系。
tianliang1 2012-09-10
  • 打赏
  • 举报
回复
哦。。。
突然想到你这个问题是怎么回事了。
你用的这个Timer是名字空间System.Windows.Forms.Timer下的,这个Timer只能在单线程中使用。但是你上面的代码,却是一个Thread里面启用的,所以不行。

你可以把那个Timer换成System.Timer.Timer;
即用显示标注Timer。

using Timer = System.Timers.Timer;

然后后面使用的地方对应换一下。
Monitor.Interval = 3000;
Monitor.Elapsed += Monitor_Tick;
Monitor.Start();


就应该ok了。
tianliang1 2012-09-10
  • 打赏
  • 举报
回复
你这个,调试一下试试呢。在你的 private void Start() 入口处打一个断点单步调试看看。。
很奇怪的是这句代码HtmlM.Html(MarcIntroduction);
你的HtmlM是一个类名,Html方法又不是静态方法,你怎么调用的呀?编译没有报错?
li365941471 2012-09-10
  • 打赏
  • 举报
回复
用timer控件试试?

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧