所以我想确保我的应用程序的UI线程上没有发生我所有的数据库/网络操作。为此,我通常使用BeginInvoke函数进行调用,然后使用Invoke执行实际更新。我不确定我是否正确地做了与应该做的事情相比的事情。任何人都可以请提供以下代码注释:C#中的异步加载 - 优化/正确使用?
private void folderTree_NodeExpandedChanged(object sender, RadTreeViewEventArgs e)
{
if (e.Node.Tag != null)
{
var path = (string) e.Node.Tag;
if (!string.IsNullOrEmpty(path))
{
if (Directory.Exists(path))
{
folderTree.BeginUpdate();
BeginInvoke(
new Action(() => GetDirectories(path, e.Node)));
folderTree.EndUpdate();
}
}
}
}
private void GetDirectories(string path, RadTreeNode parent)
{
var dirs = (new DirectoryInfo(path)).GetDirectories();
Array.ForEach(dirs, d => Invoke(new Action(
() => AddNode(d.Name, d.FullName, parent))));
}
感谢球员,我以为BeginInvoke做了一个非UI线程的异步调用。我使用了后台工作者,而且工作。 但是,一个简单的问题是,来自背景工作的事件worker_RunWorkerCompleted会在UI线程上触发,还是必须从它调用Invoke来更新UI组件? – 2009-07-14 20:12:53