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 을 처리하는 함수
버벅거리는 문제가 사라졌다.