0

사용자가 작업을 추가 할 수있는 목록 뷰가있는 양식이 있습니다. 그런 다음 사용자가 버튼을 클릭하면 응용 프로그램이 목록보기의 각 작업을 1 씩 실행합니다.이 상황에서 멀티 스레딩은 어떻게 구현합니까? 가능한가?

이러한 작업은 실제로 작업을 완료하는 지시와 비슷합니다. 각 항목을 통과하는 루프가있는 클래스를 작성한 다음 각 항목 (명령)에 설정 한 작업을 완료하면됩니다. 구문 분석을 시작하려면 해당 함수를 호출하는 폼에 단추가 있어야합니다. IE : RunTask (listview1, 1) - 기본적으로이 클래스는 지정된 목록보기 및 시작 항목이있는 클래스에있는 루프를 시작합니다.

화면 잠금 기능을 제외한 모든 기능이 완벽하므로 응용 프로그램이이 목록보기 항목을 분석하지 못하도록 중지 기능을 구현할 수 없습니다. 나는 크로스 탭없이 이것을 구현할 수있는 방법을 이해하지 못한다. 왜냐하면 나는 분리되어 실행하고자하는 스레드가 항상이리스트 뷰에 접근 할 것이기 때문이다. 목록보기를 제거하기 위해 프로그램을 재 설계하는 것은 타당하지 않습니다. 내가 너무 사람이 버그를 일으켰지 만 application.doevents 했어. 나는이 문제를 해결하는 방법에 대해 수일 동안 연구 해왔다.하지만 나는 생각이 없다. 바라건대 누군가는 약간의 빛을 깡통 깡통.

또한 분명히 checkforillegalcrossthreadcalls = false를 설정해야했지만이 문제를 해결하기 위해 백그라운드 작업자를 추가했습니다.이 작업은 현명한 작업이 아닙니다.

+2

보기에서 데이터를 분리하십시오. 데이터를 저장하기 위해 ListView가 필요하지는 않지만 컬렉션 객체로 설계되지 않았습니다. –

+0

유일한 것은 정보를 listview items 태그에도 저장한다는 것입니다. 또한 일시 중지 단추를 클릭하면 현재 항목이 선택되므로 일시 중지 할 수 있도록 설정되어 있습니다. 그런 다음 재생 버튼이 다시 눌려지면 항목이 선택되어 있는지 확인하고 해당 항목에서 시작하는지 여부를 확인합니다. 또한 Listview를 직접 사용하는 몇 가지 다른 기능이 있습니다. 표준 목록에서는 가능하지 않다고 생각합니다. 귀하의 의견을 보내 주셔서 감사합니다. – user1632018

답변

0

이와 같이하십시오. 목록보기를 가져와 UI와 관련이없는 값 집합으로 바꿉니다. 이처럼 :

 string[] values = 
      this 
       .listView1 
       .Items 
       .Cast<ListViewItem>() 
       .Select(x => x.Text) 
       .ToArray(); 

그런 다음 당신은 백그라운드에서 작업을 실행하기 위해 병렬 태스크 라이브러리를 사용할 수 있습니다

 tokenSource.Cancel(); 
: 당신이 작업을 취소해야하는 경우

 var tokenSource = new System.Threading.CancellationTokenSource(); 
     var token = tokenSource.Token; 

     var task = System.Threading.Tasks.Task.Factory 
       .StartNew(() => RunTasks(values, 1), token); 

이 작업을 수행 할 수 있습니다

하지만 작업 완료시 UI 업데이트를 처리하려면 다음을 수행하십시오.

 task.ContinueWith(r => 
     { 
      /* When compete code */ 
     }); 

UI 업데이트를 호출하여 UI 스레드로 이동하는지 확인하십시오.

VB.NET에서이 글을 쓰지 않았 음을 사과드립니다. 내 VB가 녹슬고있다.

+0

그러면 기본적으로 목록보기가 목록으로 바뀝니 까? 그렇다면 목록보기를 사용하는 것에 대한 위의 주석을 추가했습니다.이 상황에서 내가 무엇을 할 것인가. 도와 주셔서 정말 고맙습니다. 나는 그것을 쉽게 변환하기 위해 변환기를 사용할 수 있다고 확신하지만 C#을 모른다. – user1632018

+0

그래서 여기에 트릭이 있습니다. 'ListViewData'라는 새로운 클래스를 만듭니다. 이 새로운 클래스의 인스턴스가되도록 (태스크 처리 코드에서만) 목록보기에 대한 참조를 변경하십시오. 이제 오류가 발생합니다. 오류가 사라질 때까지 오류 인 ListViewData 클래스에 하나씩 하위 클래스/메서드/속성을 추가하십시오. 이제 UI'ListView' 클래스를 UI가 아닌'ListViewData' 클래스로 분리했습니다. 이러한 종류의 리팩토링은 잠시 후에 아주 쉽게 이루어져야합니다. 행운을 빕니다. – Enigmativity

+0

늦게 답장을 드려 죄송합니다.이것이 내가 한 일이지만 고맙습니다. – user1632018

관련 문제