这怎么可能?如果没有网络连接,我有一个被调用的计时器,如方法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
的{{1}}方法:
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();
答案 0 :(得分:4)
你的计时器需要一个消息泵来运行。 MessageBox.Show()提供了一个。
但是你要完全避免使用消息框(查看Systems.Diagnostsics.Debug.Print())。
您应该查看其他计时器(System.Threading,System.Timers)。
第2部分
您声明Foo()
在线程上运行。听起来不错。
但是你的Windows.Forms.Timer需要一个MessageBox来运行这一事实意味着你以某种方式阻止你的主线程。所以你的问题不在发布的代码中,而在其他地方。