1

Marc Gravellを引用するには:

///...blah blah updating files
string newText = "abc"; // running on worker thread
this.Invoke((MethodInvoker)delegate {
    someLabel.Text = newText; // runs on UI thread
});
///...blah blah more updating files

私はこれをWPFで実行しようとしているので、このinvokeメソッドを使用できません。何かご意見は?このスレッディングのものは私の頭をやっています:/

より詳しく

私はそのように私の新しいスレッドを始めました

Thread t = new Thread (LoopThread);
t.Start();
t.Join();

しかし、全体を通してLoopThread、私はUIに書き込みたいと思います。

アップデート

JonSkeetにDispatcher.Invoke少し感謝します。WinFormsMethodInvokerでもあるようです。WPFと同等ですか?

更新2

System.Windows.Forms.MethodInvokerの代わりに、を使用して提案してくれたAdrianoに感謝しSystem.Actionます。

(皆さんはthisパラメーターの混乱について正しかったので、エラーを削除するためにビルドする必要があります。)

を追加してからのバスSimpleInvoke、今私は打たれています

Extension method must be defined in a non-generic static class

ライン上

public partial class MainWindow : Window

何かご意見は?

4

3 に答える 3

6

WPFでは、Dispatcher.Invokeの代わりにを使用しますControl.Invoke

クラス(WPFクラスのDispatcherObject派生元)はDispatcherプロパティを公開するため、次のものが必要です。

Dispatcher.Invoke((Action) delegate {
    someLabel.Text = newText; // runs on UI thread
});

C#3以降(および.NET 3.5以降)を使用している場合は、次の機能に拡張メソッドを追加することをお勧めしますDispatcherObject

// Make this a new top-level class
public static class DispatcherObjectExtensions
{
    public static void SimpleInvoke(this DispatcherObject dispatcherObject,
                                    Action action)
    {
        dispatcherObject.Dispatcher.Invoke(action);
    }
}

したがって、次を使用できます。

// From within your UI code
this.SimpleInvoke(() => someLabel.Text = newText);
于 2012-06-21T11:19:20.527 に答える
0

同期コンテキストを使用した妥協案として:

    // gui thread

    var sc = SynchronizationContext.Current;

// work thread

    sc.Post(s => 
    {
    someLabel.Text = newText
    }, null);
于 2012-06-21T22:35:14.870 に答える
-1

Jon Skeetのコメントから続けて、以下のように内線番号を呼び出すことができます

DispatcherObject.SimpleInvoke(() => someLabel.Text = newText);
于 2012-06-21T11:47:34.523 に答える