6

.NETには。がありSystem.Threading.Thread.IsBackgroundます。

WinRT / Metroにこれに相当するものはありますか?

UIプロパティを変更するメソッドがあり、実行をUIスレッドランタイムにディスパッチする必要があるかどうかを判断したいと思います。

4

2 に答える 2

16

アプリでMVVMLightToolkitを使用する場合は、この状況を自動的に処理するGalaSoft.MvvmLight.Threading.DispatcherHelperクラスのCheckBeginInvokeOnUI(アクションアクション)メソッドを使用できます。

GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
    Gui.Property = SomeNewValue;
});



編集:

次のコードは、 MVVMLightToolkitのDispatcherHelperクラスに基づいています-リンク


しかし、MVVM Light(ちなみにかなりクールなもの)を使用したくない場合は、次のようなものを試すことができます(申し訳ありませんが、これが機能するかどうかを確認できません、Windows 8がありません):

var dispatcher = Window.Current.Dispatcher;

if (dispatcher.HasThreadAccess)
    UIUpdateMethod();
else dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => UIUpdateMethod(););


このロジックを次のように別のクラスに配置するとよいでしょう。

using System;
using Windows.UI.Core;
using Windows.UI.Xaml;

namespace MyProject.Threading
{
    public static class DispatcherHelper
    {
        public static CoreDispatcher UIDispatcher { get; private set; }

        public static void CheckBeginInvokeOnUI(Action action)
        {
            if (UIDispatcher.HasThreadAccess)
                action();
            else UIDispatcher.RunAsync(CoreDispatcherPriority.Normal,
                                       () => action());
        }

        static DispatcherHelper()
        {
            if (UIDispatcher != null)
                return;
            else UIDispatcher = Window.Current.Dispatcher;
        }
    }
}


次に、次のように使用できます。

DispatherHelper.CheckBeginInvokeOnUI(() => UIUpdateMethod());
于 2012-08-16T09:33:12.170 に答える
3

CoreApplication.Windowを介してメインUIスレッドにアクセスできます。

 if (CoreApplication.MainView.CoreWindow.Dispatcher.HasThreadAccess)
            {
                DoStuff();
            }
            else
            {
                await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    DoStuff();
                });
            }
于 2012-09-18T14:24:39.693 に答える