我使用WebBrowser控件作为特殊类型标记的“预览”。我处理标记,然后设置浏览器的DocumentText属性以显示它。这没关系。
但是,有时控制需要5-10秒才能完成此操作。因为我在应用程序启动时执行此操作(使用DocumentText = ""
消隐窗口),并且仍然需要永远执行此操作,我想以某种方式线程这个或类似的东西,以便应用程序的其余部分可以在控件启动时......尽其所能。
作为参考,有问题的功能是:
private void btnRefresh_Click(object sender, EventArgs e) {
try {
scrolltop = html.Document.Body.ScrollTop;
scrollleft = html.Document.Body.ScrollLeft;
} catch (NullReferenceException) { }
html.DocumentText = HtmlProcessing.ProcessCode(txtCode.Text); //takes 5-10 seconds
}
我知道我不能只启动一个线程来处理这个问题,因为我认为如果我尝试从其他线程访问它,WebBrowser控件将会发挥作用。有没有其他技术可以用来做到这一点?
修改
事实证明,我的延迟不是由html.DocumentText
引起的,也不是由HtmlProcessing.ProcessCode
引起的,而是由我从示例中省略的一些代码引起的,因为我认为这无关紧要:
private void btnRefresh_Click(object sender, EventArgs e) {
try {
scrolltop = html.Document.Body.ScrollTop;
scrollleft = html.Document.Body.ScrollLeft;
} catch (NullReferenceException) { }
html.DocumentText = HtmlProcessing.ProcessCode(txtCode.Text, GetImageList());
}
对GetImageList()
的号召是永远的。该函数的内容如下所示:
List<string> GetImageList() {
List<string> ret = new List<string>();
ret.AddRange(Directory.GetFiles(settings.LocalImageFolder).Where((f) => { return extensions.Contains(Path.GetExtension(f)); }));
ret.AddRange(Directory.GetFiles(settings.RemoteImageFolder).Where((f) => { return extensions.Contains(Path.GetExtension(f)); }));
return ret;
}
而且,settings.RemoteImageFolder实际上是一个永远需要的网络路径。我最终把它变成IEnumerable<string>
。这样,当ProcessCode
实际需要文件时,我才会点击网络。
答案 0 :(得分:0)
问题是网络访问速度缓慢,隐藏在属性访问器后面,与Web浏览器控件无关。