2010-02-15 5 views
3

스레드에 ListView 채우기 코드를 넣어야합니다. 간단한 경우이 스레드는 두 번 실행하면 안됩니다. 이전에 중단해야 할 새로운 스레드를 발행하고 싶을 때, 그랬던 것처럼.C#에서 ListView를 안전하게 채우는 방법은 무엇입니까?

EDIT 1

시나리오는 다음과 같다.
ListView 위에 텍스트 필터가 있습니다. textchange에서 populateList() 메서드를 호출합니다.
큰 데이터베이스에서 SQL LIKE 구문을 사용하므로 코드가 오래 걸릴 수 있습니다.

이 작업이 실행될 때까지 사용자는 아무 것도 입력 할 수 없습니다. 따라서 "abc"를 입력하는 동안 끊어짐이 끊어지면 10 초 후에 "c"를 입력하십시오.

그래서 Thread에서 populateList() 메소드를 실행하고 사용자가 더 빠르게 뭔가를 입력 할 수있게했습니다. 텍스트가 길수록 SQL 쿼리가 느려집니다. "abc"상황에서 "a"를 입력하면 쿼리가 실행되지만 사용자가 "b"를 누르면 "a"스레드의 실행을 중지하고 새 스레드를 발행하려고합니다 "ab"를 사용하는 등 ... "c".

편집

이 아직도 더 해답을 찾고.

답변

1

나는 질문이 맞는지는 모르겠다 ... 만약 당신이 여러 스레드를 다루고 있고 어떤 이유로 당신이 이전 스레드를 멈추고 싶다면 이전 스레드가 살아 있고 포기하고 있는지 새로운 스레드를 체크 할 수있다. 그 행동이 갑자기 ... 만약 당신이 기대하는 바가 아니었다면 당신의 질문에 대해 자세히 설명해 줄 수 있습니까?

업데이트 :
이제 귀하의 질문을 매우 잘 이해했습니다. 심지어 나는 그런 문제에 대해서 노력하고 있지만 db는 메모리에있다. 당신의 데시벨이 LIMIT를 지원하는 경우 귀하의 경우에는, 당신은 '에 대한'루프에 사용

LIMIT LOWERLIMIT UPPERLIMIT 스레드의 방법에서 이제

를 사용하여 쿼리에서 반환 된 결과의 수를 제한 할 수 있습니다 결과 세트 및 각 반복 검사에서 텍스트 상자 텍스트가 변경되었는지 확인하십시오. 변경된 경우 루프를 중단하고 목록을 지우고 스레드의 메서드 시작 부분으로 이동 한 다음 동일한 스레드를 사용하지만 textfilter가 다른 동일한 프로세스를 수행합니다.

의사 코드 :이 도움이

do 
    isLoop = false 
    clear the collection that is bound to the listbox 
    from db, get the record count  
    for: loop 0 to recordcount increment batchsize 
     get chuncks of data from db of size batchsize 
     add the data to collection [using dispatcher.invoke] 
     if textbox text changed 
     isLoop = true 
     break for-loop 
     endif 
    endfor 
while(isLoop) 

희망.

+0

질문에 대한 나의 편집보기 – Pentium10

+0

나는 이것을 시도 할 것이지만, 모으기 과정이 끝난 후에 만 ​​이벤트 솔기가 발사되기 때문에 루프의 변화를 감지 할 수 있을지 모르겠다. 제가 확인하겠습니다. – Pentium10

+0

안녕 펜티엄, 그냥 해봤 어. 그것은 작동합니다. 너에게도 효과가 있는지 알려주지. 내 의사 코드 수정 확인 – Amsakanna

관련 문제