如何确定是否所有线程都已完成C#

时间:2016-05-26 08:44:26

标签: c# wpf multithreading squirrel.windows

我有一个WPF应用程序在后台更新自己(通过Squirrel.Windows) 这是通过以下代码完成的:

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()的{​​{1}} 这是一个Async和Await调用,因此它将在后台完成。现在我想知道是否有可能在我关闭我的应用程序之前我可以看到这个启动的线程是否仍在运行..如果是这样我无法关闭应用程序但我想隐藏任务栏中的图标并最小化应用程序。所以我仍然可以在完成后更新我想关闭应用程序......

我希望有人能指出我正确的方向。

更新: 以下是App.xaml.cs中我的OnStartup的完整代码

App.xaml.cs

我想要做的是让Squirrel确定是否有更新,他们将自动下载所有必要文件并在重新启动应用程序后应用它们。但是因为这个应用程序是另一个应用程序的启动程序,它将检查此应用程序的更新并安装(解压缩)它们,它将在安装完成并安装应用程序启动后自行关闭。但是如果启动器应用程序仍在更新,则无法关闭并重新启动它。

使用简单的visio绘图进行简短的解释: The Visio drawing

1 个答案:

答案 0 :(得分: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和/或检查任务的状态。