WinRT (Windows 8 Metro) の UI スレッドでコードを実行するにはどうすればよいですか?
Invoke
メソッドが存在しません。
WinRT (Windows 8 Metro) の UI スレッドでコードを実行するにはどうすればよいですか?
Invoke
メソッドが存在しません。
非 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;
使用する:
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 とそれ以降のビルドの両方で機能するはずです。
使用する:
this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Frame.Navigate(typeof(Welcome), this));
わたしにはできる。
これは私の意見でははるかに簡単な方法です。
UIに関連付けられているTaskSchedulerを取得します。
var UISyncContext = TaskScheduler.FromCurrentSynchronizationContext();
次に、新しいタスクを開始し、上記のUISyncContextで開始します。
Task.Factory.StartNew(() => { /* Do your UI stuff here; */}, new System.Threading.CancellationToken(), TaskCreationOptions.PreferFairness, UISyncContext);
DispatcherTimerもオプションです。
Xaml デザイナーで実行する必要があるコードに使用しました (CoreWindow.Dispatcher などは UWP デザイナーでは使用できません)。
var localTimer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(0)
};
localTimer.Tick += (timer, e) =>
{
(timer as DispatcherTimer).Stop();
action();
};
localTimer.Start();
免責事項:
他のすべてが失敗した場合、これは最後の手段であることに注意してください。