0

バックグラウンドで (Squirrel.Windows 経由で) 自分自身を更新している WPF アプリケーションがあります。これは、次のコードによって行われます。

var restartApp = false;
using (var mgr = new UpdateManager(@"http://wintst01:8282/unidealoffice/starter"))
{
    var re = await mgr.UpdateApp(DownloadProgress);
    if (re == null)
    {
        Debug.WriteLine("NULL");
    }
    else
    {
        MessageBox.Show($"Applicatie is bijgewerkt en dient herstart te worden\nNieuwe versie: {re.Version}", "Update");
        restartApp = true;
    }
}
if (restartApp)
{
    UpdateManager.RestartApp();
}

このコードはOnStartup()This App.xaml.cs is an Async and Await 呼び出しの中にあるため、バックグラウンドで実行されます。アプリケーションを閉じる前に、それが可能かどうかを知りたいのですが、開始されたこのスレッドがまだ実行されているかどうかを確認できます。そうであれば、アプリケーションを閉じることはできませんが、タスクバーからアイコンを非表示にしてアプリケーションを最小化したいです。終了しても更新できるので、アプリケーションを閉じたい...

誰かが私を正しい方向に向けてくれることを願っています。

更新: App.xaml.cs の OnStartup の完全なコードは次のとおりです。

protected override async void OnStartup(StartupEventArgs e)
    {
        this.Dispatcher.UnhandledException += Dispatcher_UnhandledException;
        for (int i = 0; i < e.Args.Length; i++)
        {
            if (e.Args[i].ToLower() == "/ForceInstall".ToLower() || e.Args[i].ToLower() == "-ForceInstall".ToLower() || e.Args[i].ToLower() == "-F".ToLower() || e.Args[i].ToLower() == "/F".ToLower())
            {
                ApplicationConstants.Instance.ForceInstall = true;
            }
        }

        base.OnStartup(e);

        var restartApp = false;
        using (var mgr = new UpdateManager(@"http://wintst01:8282/unidealoffice/starter"))
        {
            var re = await mgr.UpdateApp(DownloadProgress);
            if (re == null)
            {
                Debug.WriteLine("NULL");
            }
            else
            {
                MessageBox.Show($"Applicatie is bijgewerkt en dient herstart te worden\nNieuwe versie: {re.Version}", "Update");
                restartApp = true;
            }
        }
        if (restartApp)
        {
            UpdateManager.RestartApp();
        }
    }

私がやろうとしているのは、必要なすべてのファイルを自動的にダウンロードし、アプリケーションの再起動後にそれらを適用する更新があるかどうかを Squirrel に判断させることです。ただし、このアプリケーションは、このアプリケーションの更新を確認してインストール (解凍) する別のアプリケーションのスターターのようなものであるため、インストールが完了してインストールされたアプリケーションが開始されると、アプリケーションは自動的に閉じます。ただし、スターター アプリケーションがまだ更新中の場合、それを閉じて再起動することはできません。

簡単なvisio図面で簡単に説明します: Visio の図面

4

1 に答える 1

1
private Task updateTask;

protected override async void OnStartup(StartupEventArgs e)
{
    updateTask = StartupAsync(e);
}

private Task StartupAsync(StartupEventArgs e)
{
    this.Dispatcher.UnhandledException += Dispatcher_UnhandledException;
    for (int i = 0; i < e.Args.Length; i++)
    {
        if (e.Args[i].ToLower() == "/ForceInstall".ToLower() || e.Args[i].ToLower() == "-ForceInstall".ToLower() || e.Args[i].ToLower() == "-F".ToLower() || e.Args[i].ToLower() == "/F".ToLower())
        {
            ApplicationConstants.Instance.ForceInstall = true;
        }
    }

    base.OnStartup(e);

    var restartApp = false;
    using (var mgr = new UpdateManager(@"http://wintst01:8282/unidealoffice/starter"))
    {
        var re = await mgr.UpdateApp(DownloadProgress);
        if (re == null)
        {
            Debug.WriteLine("NULL");
        }
        else
        {
            MessageBox.Show($"Applicatie is bijgewerkt en dient herstart te worden\nNieuwe versie: {re.Version}", "Update");
            restartApp = true;
        }
    }
    if (restartApp)
    {
        UpdateManager.RestartApp();
    }
}

クロージング イベントでは、updateTask を待機したり、タスクのステータスを確認したりできます。

于 2016-05-27T08:32:05.247 に答える