【发布时间】:2011-12-31 12:24:27
【问题描述】:
这怎么可能?我有一个计时器,如果没有网络连接,就会调用它,如方法 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
}
}
}
和Timer的_Tick方法:
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();
}
}
这很奇怪,只要我在SearchNetworkConnection.Start() 之后调用MessageBox.Show()。
换句话说,它不起作用,定时器不会运行:
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;
}
【问题讨论】:
-
即使计时器已经启动,您的
Foo方法也会调用Timer.Start。调用Start是否有可能重置时间间隔?也许你应该写if (!net.HasConnection() && !SearchNetworkConnection.Enabled)。