67

WinRT (Windows 8 Metro) の UI スレッドでコードを実行するにはどうすればよいですか?

Invokeメソッドが存在しません。

4

6 に答える 6

81

非 UI スレッドからCoreWindowを直接取得する方が簡単です。GetForCurrentThread()次のコードは、 orがnullWindow.Currentを返す場合でも、どこでも機能します。

CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
    <lambda for your code which should run on the UI thread>);

例えば:

CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
    () =>
    {
        // Your UI update code goes here!
    });

Windows.ApplicationModel.Core名前空間を参照する必要があります。

using Windows.ApplicationModel.Core;
于 2013-06-26T08:32:33.343 に答える
69

使用する:

UI スレッドから、次を実行します。

var dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;

バックグラウンドから (非 UI スレッド)

dispatcher.RunAsync(DispatcherPriority.Normal, 
    <lambda for your code which should run on the UI thread>);

これは、CP とそれ以降のビルドの両方で機能するはずです。

于 2012-05-15T05:02:53.663 に答える
8

使用する:

this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Frame.Navigate(typeof(Welcome), this));

わたしにはできる。

于 2012-09-14T07:32:38.667 に答える
5

これは私の意見でははるかに簡単な方法です。

UIに関連付けられているTaskSchedulerを取得します。

    var UISyncContext = TaskScheduler.FromCurrentSynchronizationContext();

次に、新しいタスクを開始し、上記のUISyncContextで開始します。

    Task.Factory.StartNew(() => { /* Do your UI stuff here; */}, new System.Threading.CancellationToken(), TaskCreationOptions.PreferFairness, UISyncContext);
于 2012-10-12T04:18:33.783 に答える
0

DispatcherTimerもオプションです。

Xaml デザイナーで実行する必要があるコードに使用しました (CoreWindow.Dispatcher などは UWP デザイナーでは使用できません)。

var localTimer = new DispatcherTimer
{
    Interval = TimeSpan.FromMilliseconds(0)
};
localTimer.Tick += (timer, e) =>
{
    (timer as DispatcherTimer).Stop();
    action();
};
localTimer.Start();

免責事項:
他のすべてが失敗した場合、これは最後の手段であることに注意してください。

于 2016-11-28T17:39:14.390 に答える