3

私は、最初の起動時に7日ごとに更新を実行して、Webからいくつかのファイルをダウンロードするアプリケーションを持っています。

この更新は、ダウンロードが必要なファイルの数に応じて、最大5分かかる場合があります。

私が考えているのは、更新の処理中にGUIの残りの部分を使用できるように、別のスレッドで更新を実行することです。

これは私のアプリケーションにとってはかなり実行可能なオプションのようですが、メインGUIに、場合によってはステータスバーに、更新が処理中であり、更新が終了すると消えることを通知するメッセージを表示したいと思います。

私はこれを行う方法を探し回っていますが、私が探している解決策として何も飛び出していないようです。これが可能かどうか、そしてそれを行う方法を誰かが知っていますか?

4

2 に答える 2

6

Dispatcher.Invokeバックグラウンド スレッドからの呼び出しで UI アクセス コードをラップするだけです。使用Dispatcherするインスタンスは、 のDispatcherプロパティを通じて取得できますUIElement

以下のメソッドが UI 要素のクラス定義内で定義されていると仮定します。

private void ProcessItems(IList<Item> items)
{
    Task.Factory.StartNew(() =>
    {
        for (int i = 0; i < items.Count; ++i)
        {
            // Code here runs on background thread.
            this.ProcessItem(items[i]);

            this.Dispatcher.Invoke(DispatcherPriority.Normal, () =>
            {
                // Code here runs on UI thread.
                this.UpdateStatus("Completed " + (i + 1) + " of " + items.Count);
            });
        }
    },
        TaskCreationOptions.LongRunning);
}
于 2012-05-11T19:45:01.653 に答える
0

この小さな男と:

internal static class ControlExtensions
{
    internal static void Invoke(this Control control, Action action)
    {
        control.Invoke(action);
    }
 }

コードを呼び出すことができます(winフォームの世界では、wpfには独自のソリューションがあります):

... form.Invoke(()=>form.SomeControl.SomeProperty=someValue);
于 2012-05-11T20:27:30.500 に答える