我正在尝试编写一个函数,该函数将动态创建标签页,填充标签,然后返回有关其内容的数据。有些事件会告诉我每个标签何时完成,所以我可以告诉我它们何时全部加载。
所有工作都与UI相关,我的理解是UI的东西必须在主线程中发生,所以听起来我不能只创建一个线程来执行此操作然后在我的函数中等待它。我是否误解了UI主题必须在主线程上的问题?如何在不阻止UI中必须执行的工作的情况下让我的函数等待?
编辑:为了澄清,标签页面有webbrowser控件,它们将加载各种网页,因此需要花费一些时间,并且每次加载时都会得到一个DocumentCompleted事件。这个想法是这样的:来电者递给我一个网址列表。我弹出一个表单并创建一个标签页,其中包含每个网址的Web浏览器控件,并在每个标签中加载一个网址。这些将在不同时间完成,每个都在页面加载时触发DocumentComplete事件处理程序。当他们全部加载时,我想将一个数据列表返回给原来的调用者。
答案 0 :(得分:1)
...我的理解是UI内容必须在主线程中发生......
不,这不一定是真的。如果你想修改背景线程中的标签,你可以这样做:
MethodInvoker m = () => { label1.Text = "Another text"; };
if (InvokeRequired) {
BeginInvoke(m);
}
else {
m.Invoke();
}
而不是:
label1.Text = "Another text";
如果您仔细考虑,则不会出现任何跨线程问题。
修改强>
如果你想重构那段代码,请查看我在问题Client Coding error for chatting application中提供的答案。
编辑2:
根据你的编辑,我就是这样做的:
DocumentComplete
事件时,都会减少变量
如果变量的值为0
,则表示已加载所有页面。现在..你什么时候需要使用Invoke
? 每次您想要从后台线程访问某些UI控件。在这种情况下,当你停止进度条时......
答案 1 :(得分:0)
我不确定我是否正确。无论如何,看看这个: