0

Application.Invoke发生在 foreach 循环内,我将其删除以节省空间。完成bwSearchEngines后,用户界面会使用Invoke. 如何纠正?每次调用调用时它都需要更新,这在我删除的 foreach 循环中调用。

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

lblStatus是状态栏上的标签,tvResultsTreeView,并且OnBtnSearchClicked是按钮单击事件

需要明确的是,我在 Debian wheezy 上运行 Gnome 3.4.2,而不是 Windows。这不是 Windows 应用程序。我正在使用MonoDevelop 3.0.3.2Gtk# 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);
}
4

1 回答 1

0

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

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

于 2015-03-23T15:42:25.457 回答