我使用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真正需要文件的时候才访问网络。
发布于 2011-07-15 16:50:48
问题是网络访问速度慢,隐藏在属性访问器后面,与web浏览器控件无关。
https://stackoverflow.com/questions/5137538
复制相似问题