WPF

[WPF] TextBox 값이 변할 때 마다 어떤 작업 실행 시 느려진다면

Chanhongv 2024. 7. 12. 16:58

TextBox 에 Binding 한 string 값이 변할 때 마다 CollectionView Filter 를 주는 프로세스를 만들어 두었었다.

그런데 TextBox 의 값이 빠르게 변하면 Filter 작업을 처리하면서 느려지는 현상이 발생했다.

그래서 다음과 같은 작업을 처리했다.

 

"Debounce 기능"

 - 일정 시간동안 연속해서 작업이 들어온 경우 모든 작업을 처리하지 않고 마지막 작업만 처리하도록 하는 기능

 

 private string searchText = string.Empty;
 public string SearchText
 {
     get { return searchText; }
     set
     {
         searchText = value;
         OnPropertyChanged();
         DebounceSearch(value);
         //OnSearchInputItems(value);
     }
 }

TextBox 에 Binding 된 String 값

 

 private CancellationTokenSource _cts = new CancellationTokenSource();
 private async void DebounceSearch(string value)
 {
     _cts.Cancel(); // 이전 작업 취소
     _cts = new CancellationTokenSource();
     var token = _cts.Token;

     try
     {
         await Task.Delay(300, token); // 300ms 대기
         if (!token.IsCancellationRequested)
         {
             OnSearchInputItems(value);
         }
     }
     catch (TaskCanceledException)
     {
         // 작업이 취소되었으므로 아무 작업도 하지 않음
     }
 }


CancellationTokenSource 를 이용하여 이전 작업을 취소할 수 있다.

 

private void OnSearchInputItems(string str)
{
    Debug.Assert(FilterCollectionView != null);
    if (string.IsNullOrEmpty(str))
    {
        FilterCollectionView.Filter = null;
    }
    else
    {

        FilterCollectionView.Filter = x => (((InputItem)x).Name1?.IndexOf(str, StringComparison.OrdinalIgnoreCase) > -1) ||
                                           (((InputItem)x).Name2?.IndexOf(str, StringComparison.OrdinalIgnoreCase) > -1) ||
                                           (((InputItem)x).Name3?.IndexOf(str, StringComparison.OrdinalIgnoreCase) > -1);
    }
}

 

실제 Filtering 을 처리하는 함수

 

버벅거리는 문제가 사라졌다.