0

Application.Invokeスペースを節約するために削除した foreach ループ内で発生します。がbwSearchEngines完了すると、UI は 内のコードで更新されますInvoke。これはどのように修正できますか?インボークが呼び出されるたびに更新する必要があります。これは、削除した foreach ループ内で呼び出されます。

ボタンが押されると、タスクを開始するボタン クリック イベントが発生します。

lblStatusはステータスバーのラベル、はtvResults、ボタン クリック イベントです。TreeViewOnBtnSearchClicked

明確にするために、私はWindows ではなく Debian wheezy で Gnome 3.4.2 を実行しています。これは 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 に答える