Gtk.Application.Invoke无效

时间:2013-06-12 22:11:15

标签: c# gtk cross-platform monodevelop gtk#

Application.Invoke发生在foreach循环中,我为了节省空间而删除了它。当bwSearchEngines完成时,ui会使用Invoke内的代码进行更新。如何纠正?每次调用invoke时都需要更新,这在我删除的foreach循环内部调用。

按下按钮时,会发生按钮单击事件,从而启动任务。

lblStatus是状态栏上的标签,tvResultsTreeViewOnBtnSearchClicked是按钮点击事件

要明确的是,我在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);
}

1 个答案:

答案 0 :(得分:0)

因为没有人想要帮助我必须自己解决这个问题。我的解决方案不是我想要的,因为它锁定了ui!在按钮单击事件中调用bwSearchEngines,而不是在已启动的线程中调用。所以在按钮事件中直接调用bwSearchEngines,它会锁定ui直到函数返回(函数完成)。这个功能是长时间运行的,不应该锁定ui但是它确实像我想要的那样更新。哦,在Application.Invoke之后我必须添加while(Application.EventsPending()) Application.RunIteration();

不幸的是,这不能以这种方式工作,因为bwSearchEngines将运行很长时间,所以阻止ui不是一个选项,但我必须更新ui。到目前为止我所展示的内容需要共同努力