Как это возможно?У меня есть таймер, который вызывается, если нет сетевого подключения, как в методе down:
public void Foo() {
for (int i = 0, count = MailList.CheckedItems.Count; i < count; i++) {
/* Check for network available connection in computer
public bool HasConnection() {
return System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
}
*/
if (!net.HasConnection()) {
SearchNetworkConnection.Start(); //start the timer
}
}
}
и метод _Tick
Timer
:
private void SearchNetworkConnection_Tick(object sender, EventArgs e) {
++ATTEMPRECONNECT;
string currentState = "attemp reconnect..";
MessageBox.Show(currentState, "..", MessageBoxButtons.OK, MessageBoxIcon.Warning);
if (ATTEMPRECONNECT >= ATTEMPRECONNECTLIMIT) {
//do abort all process
SearchNetworkConnection.Stop();
}
}
, который работает странным образомпросто если я позвоню MessageBox.Show()
после SearchNetworkConnection.Start()
.
Другими словами, он не работает, таймер не запустится:
if (!net.HasConnection()) {
SearchNetworkConnection.Start();
}
вызов MessageBox.Show()
,все работает нормально:
if (!net.HasConnection()) {
SearchNetworkConnection.Start();
MessageBox.Show("lol");
}
, если это может быть полезно, метод Foo()
запускается в потоке.
Обновление
Так что, я думаю, это немного странно.Я написал простой код для некоторых тестов.и я удивлен, ошибка продолжается.Приведенный ниже код работает нормально, но если вы измените порядок
timer.Start();
DialogResult result = MessageBox.Show(text, caption);
на
DialogResult result = MessageBox.Show(text, caption);
timer.Start();
, он не будет работать, таймер не запустится.
public static DialogResult Show(string text, string caption,int dellay)
{
Timer timer = new Timer();
timer.Interval = dellay;
timer.Start();
DialogResult result = MessageBox.Show(text, caption);
timer.Tick += new EventHandler(delegate
{
IntPtr handle = FindWindow(null, caption);
if (handle != IntPtr.Zero)
{
IntPtr hresult = SendMessage(handle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
if (hresult == IntPtr.Zero)
{
timer.Stop();
timer.Dispose();
}
}
});
return result;
}