2010-08-15 57 views
1

我是C#的新手,我希望我對該問題的描述是可讀的。 這是我的問題,我正在開發一個win6.5手機應用程序。該應用程序應該有一些memu項目,一個是「掃描」,點擊後,它會反覆掃描附近的wifi接入點,並將它們顯示在列表視圖中。因此,我創建了一個線程,每隔10秒掃描一次while循環,我還使用listview.invoke使線程中的listview可訪問。單擊'scan'時,事物看起來很好,但是,由於while循環線程的運行,其他菜單項不能被點擊。我堅持在這裏好幾天了,對u人非常感謝幫助〜[C#窗體]在線程中調用listview時,其他控件不起作用

private void menuItemScan_Click(object sender, EventArgs e) 
     { 
      ... 

      Thread t = new Thread(new ThreadStart(ScanThread)); 
      t.Start(); 
     } 

     private void ScanThread() 
     { 

      listView1.Invoke(new APScanCallback(APScan)); 

     } 

     public void APScan() 
     { 
      while (true) 
      { 

       listView1.Items.Clear(); 
       foreach (AccessPoint ap in wzcInterface.NearbyAccessPoints) 
       { 
        ListViewItem item = new ListViewItem(ap.Name); 
        item.SubItems.Add(ap.PhysicalAddress.ToString()); 
        item.SubItems.Add(ap.SignalStrength.Decibels.ToString()); 
        item.SubItems.Add(ap.AuthenticationMode.ToString()); 
        listView1.Items.Add(item); 
       } 
       listView1.Refresh(); 
       Thread.Sleep(10000); 
      } 

     } 

回答

3

Control.Invoke「入隊」的方法執行的線程處理UI(以連載的例程調用其他UI程序調用) 。

即使您啓動調用Control.Invoke的線程,例程APSScan在調用Application.Run的線程中執行...我看到的是APSScan從不返回,導致凍結UI線程。

解決方法是多次調用Control.Invoke,循環在ScanThread例程中。

使用代碼:

private void ScanThread() 
    { 

     while (true) { 
      listView1.Invoke(new APScanCallback(APScan)); 
      Thread.Sleep(10000); 
     } 
    } 

    public void APScan() 
    { 
      listView1.Items.Clear(); 
      foreach (AccessPoint ap in wzcInterface.NearbyAccessPoints) 
      { 
       ListViewItem item = new ListViewItem(ap.Name); 
       item.SubItems.Add(ap.PhysicalAddress.ToString()); 
       item.SubItems.Add(ap.SignalStrength.Decibels.ToString()); 
       item.SubItems.Add(ap.AuthenticationMode.ToString()); 
       listView1.Items.Add(item); 
      } 
      listView1.Refresh(); 
    } 
+0

非常感謝,它的工作原理。是因爲我的代碼調用APScan()在UI線程中執行?所以我應該把while語句放在scanThread中,然後應用程序在執行APScan()中的代碼時才凍結? – seekinghelp 2010-08-15 07:01:07

+0

順便說一句,有沒有一種方式,應用程序永遠不會凍結時更新列表視圖? – seekinghelp 2010-08-15 07:10:00

+0

@seekinghelp該應用不凍結。 UI線程執行例程;從這些例程中獲取更多時間對應於較慢的UI更新。 UI例程中的無限循環總是會凍結UI更新程序線程。 – Luca 2010-08-15 08:08:28

0

您的代碼實際上是在主線程中運行。

listView1.Invoke(new APScanCallback(APScan));

此代碼在主應用程序線程中提交APScan的執行。只需使用定時器工作線程的insteaf。

+0

.NET Compact Framework支持定時器? – Luca 2010-08-15 06:50:30

+0

嗨,亞歷克斯,盧卡的建議對我有用,但我會對計時器進行一些研究,看看它如何解決我的問題。 謝謝 – seekinghelp 2010-08-15 07:04:32

相關問題