Это зависит от того, что вы хотите, чтобы второй поток сделал.Если вы хотите, чтобы второй поток просто пропустил показ окна, вы можете использовать семафор , чтобы гарантировать, что окно отображается только в одном потоке, например:
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
}
}
}
Если вам нужны дополнительные разъяснения, дайте мне знать, и япопробуйте расширить ответ.