调用MessageBox.Show()时,定时器才有效

时间:2011-12-31 12:24:28

标签: c# .net winforms timer

这怎么可能?如果没有网络连接,我有一个被调用的计时器,如方法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();

1 个答案:

答案 0 :(得分:4)

你的计时器需要一个消息泵来运行。 MessageBox.Show()提供了一个。

但是你要完全避免使用消息框(查看Systems.Diagnostsics.Debug.Print())。

您应该查看其他计时器(System.Threading,System.Timers)。


第2部分

您声明Foo()在线程上运行。听起来不错。
但是你的Windows.Forms.Timer需要一个MessageBox来运行这一事实意味着你以某种方式阻止你的主线程。所以你的问题不在发布的代码中,而在其他地方。