Блокировать параллельные потоки только тогда, когда Windows была закрыта - PullRequest
0 голосов
/ 13 мая 2018

У меня есть код

private void AbrirConexao(string strConexao)
{
    try
    {
        conexao = new NpgsqlConnection(strConexao);
        conexao.Open();
    }
    catch (Exception)
    {
        ReconectarDB(null, strConexao);
    }
}

public bool ReconectarDB(string strConexao)
{
    bool erroConexao = false;
    BackgroundWorker bw = new BackgroundWorker();
    bw.DoWork += (obj, ea) =>
    {
        int erro = 0;
        while (erro <= 4)
        {
            Thread.Sleep(1000);
            try
            {
                conexao = new NpgsqlConnection(strConexao);
                conexao.Open();
                erroConexao = false;
                break;
            }
            catch
            {
                erro++;
                erroConexao = true;
            }
        }
    };
    bw.RunWorkerCompleted += (obj, ea) =>
    {
        if (erroConexao)
            DialogReconectando.AlterarTela(ErroConexao.SemConexao);
        else
            DialogReconectando.Close();
    };
    bw.RunWorkerAsync();

    Application.Current.Dispatcher.Invoke(new Action(() =>
    {
        if (DialogReconectando == null || Conexao.DialogReconectando.IsLoaded == false)
            DialogReconectando = new   DialogErroConexao(ErroConexao.Reconectando);

        if(DialogReconectando.ShowActivated)
        {
            DialogReconectando.ShowActivated = true;
            DialogReconectando.ShowDialog();
        }
    }));

    return erroConexao;
}

Я использую метод Open Connection для подключения к базе данных.и когда соединение не удается, ReconnectDB пытается восстановить соединение с базой данных.Если это не удается, открывается окно, в котором есть две кнопки: «Повторить» и «Прервать работу системы».

Проблема в том, что существуют ситуации, когда я использую другие параллельные потоки, которые выполняют запросы к базе данных.В этих случаях я бы не хотел, чтобы он отображал новое окно.Поэтому, если открыто окно, я бы хотел, чтобы поток блокировался до тех пор, пока окно не будет закрыто.Я попытался решить проблему с помощью EventWaitHandle.Тем не менее, Window также пойман в этой ситуацииНе могли бы вы представить, как решить эту проблему?

1 Ответ

0 голосов
/ 13 мая 2018

Это зависит от того, что вы хотите, чтобы второй поток сделал.Если вы хотите, чтобы второй поток просто пропустил показ окна, вы можете использовать семафор , чтобы гарантировать, что окно отображается только в одном потоке, например:

SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);

private void ShowWindowNonBlocking()
{
    bool acquiredLock = false;
    try
    {
        acquiredLock = semaphore.Wait(0);
        if (acquiredLock)
        {
            // This thread now has exclusive access to the isWindowShown variable
            var result = MessageBox.Show(
                "Retry the connection?",
                "Connection Failed",
                MessageBoxButtons.RetryCancel);

            if (result == DialogResult.Retry)
            {
                // Retry the connection
            }
        }
        else
        {
            // Another thread is showing the window
        }
    }
    finally
    {
        if (acquiredLock)
        {
            semaphore.Release();
        }
    }
}

Вотхороший сайт, к которому я время от времени обращаюсь по поводу механизмов блокировки: http://www.albahari.com/threading/part2.aspx#_Semaphore

Если, однако, вы хотите, чтобы второй поток блокировался до завершения первого окна (например, если вы хотите знать,каким был результат окна, чтобы узнать, следует ли повторить попытку во втором потоке), вы можете использовать блокировку, например:

private object windowLock = new object();

private void ShowWindowBlocking()
{
    lock (windowLock)
    {
        var result = MessageBox.Show(
            "Retry the connection?",
            "Connection Failed",
            MessageBoxButtons.RetryCancel);

        if (result == DialogResult.Retry)
        {
            // Retry the connection
        }
    }
}

Если вам нужны дополнительные разъяснения, дайте мне знать, и япопробуйте расширить ответ.

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