Как я могу создать единственное использование приложения экземпляра, Нажимают Once?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
15
задан Community 23 May 2017 в 11:58
поделиться

3 ответа

Для занятия проблемой мы создали опытное приложение, которое имеет следующие две технических возможности.

  1. Несколько экземпляров на одном ПК отключены. Единственное приложение экземпляра развертывается через clickonce. Когда пользователь попытается запустить второй экземпляр приложения, сообщение откроется, указывая, что "Другой экземпляр уже работает".

  2. Проверки на обновление асинхронно и установки обновление, если Вы существуете. Сообщение: "Обновление доступно", откроется, если будет обновление, доступное, когда пользователь выполняет новый экземпляр.

процесс для создавания демонстрационного приложения следующие:

Шаг 1: Обнаружьте активное приложение экземпляра с помощью Взаимоисключающего класса.

namespace ClickOnceDemo
{
    static class Program
    {
        /// summary>
        /// The main entry point for the application.
        /// /summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault( false );
            bool ok;
            var m = new System.Threading.Mutex( true, "Application", out ok );
            if ( !ok )
            {
                MessageBox.Show( "Another instance is already running.", ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString() );
                return;
            }
           Application.Run( new UpdateProgress() );
        }
    }
}

Шаг 2: обновление Дескриптора программно

, Прежде чем мы сделаем это, мы должны отключить автоматическую проверку обновления ClickOnce (в Публиковании - Обновления... диалоговое окно).

Затем мы создаем две формы: UpdateProgress и mainForm, где UpdateProgress указывает на прогресс загрузки и mainForm, представляют главное приложение.

, Когда пользователь запустит приложение, updateProgress будет запущен во-первых для проверки на обновления. Когда обновление завершится, mainForm запустится, и updateProgress будет скрыт.

namespace ClickOnceDemo
{
public partial class UpdateProgress : Form
 {
  public UpdateProgress()
        {
            InitializeComponent();
            Text = "Checking for updates...";

            ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
            ad.CheckForUpdateCompleted += OnCheckForUpdateCompleted;
            ad.CheckForUpdateProgressChanged += OnCheckForUpdateProgressChanged;

            ad.CheckForUpdateAsync();
       }

        private void OnCheckForUpdateProgressChanged(object sender, DeploymentProgressChangedEventArgs e)
        {
            lblStatus.Text = String.Format( "Downloading: {0}. {1:D}K of {2:D}K downloaded.", GetProgressString( e.State ), e.BytesCompleted / 1024, e.BytesTotal / 1024 );
            progressBar1.Value = e.ProgressPercentage;
        }

        string GetProgressString( DeploymentProgressState state )
        {
            if ( state == DeploymentProgressState.DownloadingApplicationFiles )
            {
                return "application files";
            }
            if ( state == DeploymentProgressState.DownloadingApplicationInformation )
            {
                return "application manifest";
            }
            return "deployment manifest";
        }

        private void OnCheckForUpdateCompleted(object sender, CheckForUpdateCompletedEventArgs e)
        {
            if ( e.Error != null )
            {
                MessageBox.Show( "ERROR: Could not retrieve new version of the application. Reason: \n" + e.Error.Message + "\nPlease report this error to the system administrator." );
                return;
            }
            if ( e.Cancelled )
            {
                MessageBox.Show( "The update was cancelled." );
            }

            // Ask the user if they would like to update the application now.
            if ( e.UpdateAvailable )
            {
                if ( !e.IsUpdateRequired )
                {
                    long updateSize = e.UpdateSizeBytes;
                    DialogResult dr = MessageBox.Show( string.Format("An update ({0}K) is available. Would you like to update the application now?", updateSize/1024), "Update Available", MessageBoxButtons.OKCancel );
                    if ( DialogResult.OK == dr )
                    {
                        BeginUpdate();
                    }
                }
                else
                {
                    MessageBox.Show( "A mandatory update is available for your application. We will install the update now, after which we will save all of your in-progress data and restart your application." );
                    BeginUpdate();
                }
            }
            else
            {
                ShowMainForm();
            }
        }

        // Show the main application form
        private void ShowMainForm()
        {
            MainForm mainForm = new MainForm ();
            mainForm.Show();
            Hide();
        }

        private void BeginUpdate()
        {
            Text = "Downloading update...";
            ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
            ad.UpdateCompleted += ad_UpdateCompleted;
            ad.UpdateProgressChanged += ad_UpdateProgressChanged;

            ad.UpdateAsync();
        }

        void ad_UpdateProgressChanged( object sender, DeploymentProgressChangedEventArgs e )
        {
            String progressText = String.Format( "{0:D}K out of {1:D}K downloaded - {2:D}% complete", e.BytesCompleted / 1024, e.BytesTotal / 1024, e.ProgressPercentage );
            progressBar1.Value = e.ProgressPercentage;
            lblStatus.Text = progressText;
        }

        void ad_UpdateCompleted( object sender, AsyncCompletedEventArgs e )
        {
            if ( e.Cancelled )
            {
                MessageBox.Show( "The update of the application's latest version was cancelled." );
                return;
            }
            if ( e.Error != null )
            {
                MessageBox.Show( "ERROR: Could not install the latest version of the application. Reason: \n" + e.Error.Message + "\nPlease report this error to the system administrator." );
                return;
            }

            DialogResult dr = MessageBox.Show( "The application has been updated. Restart? (If you do not restart now, the new version will not take effect until after you quit and launch the application again.)", "Restart Application", MessageBoxButtons.OKCancel );
            if ( DialogResult.OK == dr )
            {
                Application.Restart();
            }
            else
            {
                ShowMainForm();
            }
        }
    }
}

приложение работает хорошо, и мы надеемся, что это - хорошее решение для проблемы.
Особая благодарность Timothy Walters для обеспечения исходного кода

22
ответ дан 1 December 2019 в 02:38
поделиться

Я не думаю, что Вы сможете сделать это вполне как это как проверка, прежде чем выполненный будет за пределами Вашего кода.

Однако можно изменить clickonce варианты развертывания для проверки на обновления во время выполнения кода.

при необходимости в большем количестве управления затем, можно использовать Обновление ApplicationDeployment или методы CheckForUpdate , чтобы иметь абсолютный по процессу обновления.

0
ответ дан 1 December 2019 в 02:38
поделиться

Уверенный - можно отключить автоматическое проверка обновления ClickOnce (в Публиковании-> Обновления.. диалоговое окно), затем используйте объекты и команды в Система. Развертывание. Пространство имен приложения для прагматичной проверки на обновления.

Выезд:

, Если существует обновление, можно сделать единственные проверки приложения экземпляра перед фактическим обновлением путем вызова:

5
ответ дан 1 December 2019 в 02:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: