ベストタイトルであることが分かりません。スプラッシュスクリーン、スレッディング、競合条件
スレッドに問題があります。 Application_Startup
私は静的なヘルパークラスの助けを借りて簡単なスプラッシュスクリーンウィンドウを開く新しいスレッドを開始します。 Application_Startup
には、ユーザーがログインしているかどうかをチェックし、まだサインインしていない場合はログインウィンドウが開きます。この時点で、ログインウィンドウが表示された場合、スプラッシュ画面はclose
になりますが、表示されません。
我々はcheck
方法でelse
条件を打ったときに物事は失敗し始めます。まず、SplashScreenHelper.Close();
にブレークポイントを設定し、Splash
のインスタンスがnullであることが判明したため、Splash
ウィンドウからのClose
は発生しません(下記のクラスを参照)。面白いのは、正しくインスタンス化され、スプラッシュ画面のウィンドウが表示された場合、どのようにnullになることができるかということです。ここで
SplashScreenHelper
クラスです:
class SplashScreenHelper
{
public static Splash SplashScreen { get; set; }
public static void Show()
{
if (SplashScreen != null)
{
SplashScreen.Show();
}
}
public static void Close()
{
if (SplashScreen == null) return;
if (!SplashScreen.Dispatcher.CheckAccess())
{
SplashScreen.Dispatcher.Invoke(DispatcherPriority.Normal,
new Action(delegate()
{
System.Windows.Threading.Dispatcher.CurrentDispatcher.InvokeShutdown();
SplashScreen.Close();
}));
}
else
{
SplashScreen.Close();
}
}
public static void ShowText(string text)
{
if (SplashScreen == null) return;
if (!SplashScreen.Dispatcher.CheckAccess())
{
SplashScreen.Dispatcher.Invoke(
DispatcherPriority.Normal,
new Action(delegate()
{
((SplashScreenViewModel)SplashScreen.DataContext).SplashScreenText = text;
}
));
}
else
{
((SplashScreenViewModel)SplashScreen.DataContext).SplashScreenText = text;
}
}
}
私たちは、私は2つの窓が持っているelse
というヒット:スプラッシュウィンドウが閉じられているはずですが、スプラッシュ画面ウィンドウとログインウィンドウを、それスプラッシュスクリーンのインスタンスがnull
で、これは何が起こるかわからないからです。
どういうわけか、check
メソッドが起動する前に起動し、ログインウィンドウを開き、elseステートメントにヒットし、スプラッシュスクリーンを閉じようとしますが、そのスプラッシュスクリーンスレッドは決して起動せず、インスタンス化しませんでした。 の場合、スレッドは最後にスプラッシュ画面をインスタンス化します。
あなたのスプラッシュ画面は何ですか?そうでない場合は、組み込みのメカニズムを使用して頭痛を避けるのはなぜですか? https://msdn.microsoft.com/en-us/library/cc656886(v=vs.110).aspx – Will
これは常にユーザーに情報を表示します。モジュールロードの進捗バーとそれには著作権表示が含まれています。一番上にパブリッシュン版。 – Dimitri