문제

나는 최근에 "클래식"스레드 대신 BackgroundWorker를 사용하려고 노력했으며 적어도 솔루션보다 더 많은 문제를 일으킨다는 것을 알고 있습니다. 배경 작업자가 동기식 읽기 (이 경우 Serialport에서)를 실행하고 1 코드 라인에서 약 30 초 동안 차단되면 CancellationPending이 솔루션이 아닙니다. 이 시점에서 응용 프로그램이 닫히면 (크로스 버튼 및 응용 프로그램을 사용하여) 프로세스는 좀비를 영원히 유지합니다.

배경 노동자 스레드를 중단하거나 죽이는 방법이 필요합니다.

도움이 되었습니까?

해결책

나는 당신이 성취하려는 것을 확실하지 않지만 아마도 serialport.datareceived 이벤트가 더 나은 솔루션입니까?

스레드 사용에 이미 능숙하다면 BackgroundWorker를 사용하는 요점이 보이지 않습니다. 처음에는 스레드를 이해하지 못하는 사람들을 위해 설계되었습니다.

게다가, 나는 실을 중단한다는 생각이 마음에 들지 않습니다. 위험한 느낌이 들며 멀티 스레드 애플리케이션은 더 이상 위험을 감수 할 필요가 없습니다.

다른 팁

나는 그 일을 한 사람을 모았다. Im Waaaay가 꺼져 있는지 알려주세요. 다음은 작동 방식에 대한 간단한 예방입니다.

var backgroundWorker = new BackgroundWorker(){WorkerSupportsCancellation = true};

backgroundWorker.DoWork += (sender, args) =>
         {                 
                 var thisWorker = sender as BackgroundWorker;
                 var _child = new Thread(() =>
                                               {
                                                   //..Do Some Code

                                               });
                 _child .Start();
                 while (_child.IsAlive)
                 {
                     if (thisWorker.CancellationPending)
                     {
                         _child.Abort();
                         args.Cancel = true;
                     }
                     Thread.SpinWait(1);
                 }                 
         };

 backgroundWorker.RunWorkerAsync(parameter);
 //..Do Something...
backgroundWorker.CancelAsync();

배경 작업자는 스레드 풀의 일부이기 때문에 우리는 그것을 중단하고 싶지 않습니다. 그러나 우리는 내부적으로 실을 실행하여 중단이 발생할 수 있습니다. 그런 다음 배경 노동자는 기본적으로 자식 스레드가 완료되거나 프로세스를 죽 이도록 신호 할 때까지 실행됩니다. 배경 작업자 스레드는 읽기 풀로 돌아갈 수 있습니다. 일반적으로 나는 이것을 헬퍼 클래스로 마무리하고 배경 스레드가 매개 변수로 전달되어 자식 스레드에서 실행되기를 원하는 대의원 메소드를 통과합니다.

누군가가 내 머리를 벽에 부딪 치는지 알려 주지만 잘 작동하는 것 같습니다. 그러나 실의 문제는 그렇지 않습니다. 다른 시간에 실행할 때 얻을 수있는 다양한 결과입니다.

백그라운드 작업자 스레드가 "배경"으로 표시되고 UI가 닫히면 끝나야하므로 프로세스는 좀비가되어서는 안됩니다.

나는 배경 노동자가 실의 살해를지지한다고 생각하지 않습니다. 작업을 취소하는 작업을 수행하는 방법에서 수행해야합니다. 귀하의 경우에는 일반 스레드가 최선의 선택이라고 생각합니다.

당신은 이것을 시도 할 수 있습니다 :

            backgroundworker.Dispose();
            backgroundworker = null;
            GC.Collect(); //this helps cleans up ram
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top