Application.Invoke
发生在foreach循环中,我为了节省空间而删除了它。当bwSearchEngines
完成时,ui会使用Invoke
内的代码进行更新。如何纠正?每次调用invoke时都需要更新,这在我删除的foreach循环内部调用。
按下按钮时,会发生按钮单击事件,从而启动任务。
lblStatus
是状态栏上的标签,tvResults
是TreeView
,OnBtnSearchClicked
是按钮点击事件
要明确的是,我在Debian wheezy上运行Gnome 3.4.2,不是Windows 。这不是Windows应用程序。我使用 MonoDevelop 3.0.3.2 和 Gtk#2.12
public void bwSearchEngines()
{
//a couple foreach loops removed to save space
Application.Invoke(delegate {
lblStatus.Text = (engines.listSearchSesults.Count+1).ToString();
tvResults.Model = lsTorrents;
});
}
protected void OnBtnSearchClicked (object sender, EventArgs e)
{
lsTorrents.Clear(); //first remove data from TreeView before populating it
btnSearch.Visible = false; //when a search is started disable search button
Task.Factory.StartNew( () => {
bwSearchEngines();
}).ContinueWith(_ => btnSearch.Visible = true);
}
答案 0 :(得分:0)
因为没有人想要帮助我必须自己解决这个问题。我的解决方案不是我想要的,因为它锁定了ui!在按钮单击事件中调用bwSearchEngines
,而不是在已启动的线程中调用。所以在按钮事件中直接调用bwSearchEngines
,它会锁定ui直到函数返回(函数完成)。这个功能是长时间运行的,不应该锁定ui但是它确实像我想要的那样更新。哦,在Application.Invoke之后我必须添加while(Application.EventsPending()) Application.RunIteration();
不幸的是,这不能以这种方式工作,因为bwSearchEngines
将运行很长时间,所以阻止ui不是一个选项,但我必须更新ui。到目前为止我所展示的内容需要共同努力