2015-03-25 3 views
0

Сокетинг не работает в моем коде, поэтому я хотел спросить, может ли кто-нибудь помочь мне. У меня это до сих пор:Отображение/скрытие метки другой темой

private void searchList_TextChanged(object sender, EventArgs e) 
    { 
      Thread th = new Thread(new ThreadStart(setLabel)); 
      th.IsBackground = true; 
      th.Start(); 

      //some code that needs time 
    if (searchBox.Text == String.Empty) 
     { 
      listViewType.Items.Clear(); 
      fillListView(); 
     } 

     else 
     { 

      listViewType.Items.Clear(); 
      var matchings = stringTypes.FindAll(delegate(string s) { return s.StartsWith(searchBox.Text); }); 

      for (int i = 0; i < matchings.Count; i++) 
      { 
       ListViewItem storeMatched = new ListViewItem(matchings[i]); 
       storeMatched.SubItems.Add(matchings[i]); 
       listViewType.Items.Add(storeMatched); 

      } 

      th.Abort(); 
      searchLabel.Visible = false; 
} 

    private void setLabel() 
    { 
     MethodInvoker set =() => searchLabel.Visible = true; 
     searchLabel.BeginInvoke(set); 
    } 

Так что searchLabel - это ярлык, который я хочу показать/скрыть. Я попытался показать ярлык перед началом операции и скрыть его после завершения. Как-то он отображается после выполнения кода (// некоторый код, который требует времени), а затем остается видимым. Как правильно это закодировать?

+1

Весь процесс для меня непонятен. Кажется более логичным поставить «код, требующий времени» в фоновый поток. В потоке пользовательского интерфейса (или основного потока) вы должны легко изменить видимый статус метки. После этого просто вызовите Visible status в True в фоновом потоке после его завершения. – Szer

+0

Я хотел сделать так. Является ли это возможным? Я попробовал «Invoke» сейчас, но он все тот же –

+0

посмотри на мой ответ ниже – Szer

ответ

2
private void searchList_TextChanged(object sender, EventArgs e) 
{ 
    searchLabel.Visible = false; 
    backgroundWorker.RunWorkerAsync(); 
} 

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    //some code that needs time 
    Thread.Sleep(1000); 
} 

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    SetLabelVisible(true); 
} 

private delegate void SetLabelVisibleDelegate(bool status); 

private void SetLabelVisible(bool status) 
{ 
    if (searchLabel.InvokeRequired) 
     searchLabel.Invoke(new SetLabelVisibleDelegate(SetLabelVisible), status); 
    else 
     searchLabel.Visible = status; 
} 
+0

Как-то он не хочет запускать метод «doWork». Это никогда не достигается. –

+0

@ScorpX вы должны добавить элемент управления BackgroundWorker через VS Designer и затем автоматически сгенерировать две подпрограммы обработчиков событий: DoWork и RunWorkerCompleted – Szer

+0

Да, это так. Большое спасибо! :) Я все равно попробую другой ответ. –

1

Вы делаете работу в потоке пользовательского интерфейса

Ваш

//some code that needs time 

Вывесите нить UI так не будет перерисовать, вы должны использовать новый асинхр/ждут вещи

Task.Run может быть неправильным для вашего случая, но мне нужно будет понять «некоторый код» больше.

private async void searchList_TextChanged(object sender, EventArgs e) 
{ 
    searchLabel.Visible = true; 

    await Task.Run(() => 
    { 
     // code that needs time 
    }); 

    // simulate 
    await Task.Delay(5000); 

    searchLabel.Visible = false; 
} 
+0

«Некоторый код» просто ищет в ListView. Таким образом, он принимает ввод текстового поля, очищает список, ищет подстроку в списке, помещает строки, которые соответствуют новому списку, а затем заполняет ListView этими строками и показывает их. –

+0

это должно быть хорошо, убедитесь, что вы не манипулируете просмотром списка в потоке, отличном от UI. Попробуйте код выше с Delay, и вы увидите, что он работает. –

+0

Он очень долго загружается ... намного дольше, чем обычно. –

Смежные вопросы