-2

過去 10 年間、UI スレッドが確実に通知を受け取るようにするために、「Dispatcher」で WPF を使用していました。基本「モデル」クラスで次のようなコードを使用していました。

[NotifyPropertyChangedInvocator]
public void RaisePropertyChanged([CallerMemberName] String propertyName = "")
{
    var propertyChanged = PropertyChanged;

    if (propertyChanged != null)
    {

        if (Dispatcher == null) // For console App
        {
            propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        else
        {
            if (Dispatcher.CheckAccess())
            {
                propertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
            else
            {
                Dispatcher.Invoke(new Action(() => propertyChanged(this, new PropertyChangedEventArgs(propertyName))));
            }
        }
    }
}

このSO Questionでは、AsynContext について話す人もいれば、Windows OS に依存していると思われる nuget パッケージ「Microsoft.NET.Sdk.WindowsDesktop」を追加する人もいます。

新しいデスクトップ アプリケーションで同等のことを行うには、どのような方法が推奨されますか? ディスパッチャはどこにありますか? 同等のものはありますか?コードを OS に依存しないように維持できますか? Microsoft が OS に依存しないソリューションを提供するまで、あと数か月待つ必要がありますか?

4

1 に答える 1

0

WPF は引き続き Windows でのみ実行され、Dispatcherまだ存在するため、問題は少し不明です。

さまざまなプラットフォームで実行されているさまざまなクライアント アプリケーションで使用されるクラス ライブラリを開発している場合は、Dispatcherサポートされている各クライアント プラットフォームに実装するインターフェイスの背後に を隠すことができます。

インターフェース:

public interface IDispatcher
{
    bool CheckAccess();
    void Invoke(Action action);
}

モデルを見る:

public ViewModel(IDispatch dispatcher) { ... }

WPF の実装:

public class WpfDispatcher : IDispatcher
{
    private readonly Dispatcher _dispatcher;

    public WpfDispatcher(Dispatcher dispatcher) =>
        _dispatcher = dispatcher;

    public bool CheckAccess() => _dispatcher.CheckAccess();

    public void Invoke(Action action) => _dispatcher.Invoke(action);
}
于 2020-01-27T15:53:46.223 に答える