스레드 / 백그라운드 작업자를 클래스에 배치하는 것이 "잘못된"/ 잘못된 디자인입니까?


15

Excel (C # 및 .Net 4)에서 읽을 클래스가 있고 해당 클래스에는 UI에서 응답을 유지하면서 Excel에서 데이터를로드하는 백그라운드 작업자가 있습니다. 내 질문은 다음과 같습니다 : 수업에 배경 근로자가있는 것이 나쁜 디자인입니까? 수업없이 수업을 만들고 백그라운드 작업자를 사용하여 수업을 진행해야하나요? 나는 이런 식으로 수업을 만드는 데 실제로 어떤 문제도 보이지 않지만 다시 초보자이기 때문에 계속하기 전에 확인해야한다고 생각했습니다.

내 코드가 작동 할 때 스택 오버 플로우에 있어야한다고 생각하지 않기 때문에이 질문이 여기에 관련되기를 바랍니다. 이것은 단지 디자인 문제입니다.


3
왜 그것이 틀렸다고 생각합니까?
Alb

1
@Alb-말하기 어렵습니다. 내 코드는 작동하고 필요를 채우지 만 오픈 소스를 만들 프로젝트 에서이 코드를 사용할 계획입니다. 내 코드가 "작동하는"것이 아니라 실제로 잘 디자인되어 있는지 확인하고 싶습니다.
Jetti

답변:


21

수업없이 수업을 만들고 백그라운드 작업자를 사용하여 수업을 진행해야하나요?

그렇습니다. 그리고 나는 왜 당신이 단일 책임 원칙을 위반하는지 말할 것 입니다. Excel 문서에 액세스하는 클래스와 Excel 문서에 액세스하는 방법 을 밀접하게 결합하면 "컨트롤러"코드 (이를 사용하는 모든 코드)가 다른 방식으로 수행 할 수 없게됩니다. 얼마나 다른지 물어볼 수 있습니까? 컨트롤러 코드에 시간이 오래 걸리지 만 순차적 인 작업을 원하는 두 개의 작업이있는 경우 어떻게합니까? 컨트롤러가 스레딩을 처리하는 기능을 허용 한 경우 하나의 스레드에서 장기 실행 작업을 함께 수행 할 수 있습니다. UI가 아닌 컨텍스트에서 Excel 문서에 액세스하고 스레드하지 않아도 되려면 어떻게해야합니까?

스레드의 책임을 호출자에게 옮기면 코드의 유연성이 향상되어 재사용 성이 향상됩니다.


2
실제 질문에 답변하고 잘 답변 한 경우 +1
Adam Lear

+1-네미 감사합니다. 당신은 내 질문에 대답했습니다. 감사합니다. 수업에서 꺼내서 새 수업에 넣겠습니다. 다시 한 번 감사드립니다!
Jetti

@Nemi-동기로드 할 다른 메소드를 만든 다음 비동기 메소드를 사용하면 허용됩니까? 아니면 하나의 동기로드 방법을 사용하는 것이 더 좋을까요?
Jetti

1
개인적으로 동기화 방법과 비동기 방법이 없습니다. 당신은 여전히 ​​책임을지고 있습니다. 나는이 정확한 문제로 여러 번 일했습니다. 내가 한 것은 SwingWorker를 모델로 한 TaskController를 만들었지 만 앱에 대한 특정 코드가 있습니다. TaskController는 진행률 표시 줄 업데이트, 마우스 커서 변경 등과 같은 작업을 수행했습니다. 호출을 위해 항상 TaskController를 작성 해야하는 보일러 플레이트 코드처럼 보일 수 있지만 궁극적으로 코드는보다 강력하고 유지 관리가 쉽습니다.
Nemi

네미 감사합니다! 내 질문에 분명히 답하고 올바른 방향으로 나를 지적했기 때문에 다시 한 번 투표를하겠습니다. 다시 감사합니다!!
Jetti

3

UI 작업이 백그라운드 작업과 별도의 스레드에서 작동하도록하는 것이 좋습니다. 그렇지 않으면 응용 프로그램이 사용 중일 때 UI가 응답하지 않게됩니다.

백그라운드 스레드에서 작동하는 부분을 자체 클래스로 분리 할 수 ​​있으면 코드가 더 깨끗해집니다.


1
정확하지만, 그의 질문을 읽는 방법에서 그는이 점을 이해하는 데 문제가 없습니다.
Nemi

내 질문이 잘못 읽 히면 죄송합니다. UI와 백그라운드 작업을 분리하는 것이 좋은 디자인이라는 것을 알고 있습니다 (필요하지 않은 경우 테스트 Excel 파일이 8k 행 이상이며 프로그램이 응답하지 않는 것처럼 보일 것입니다). 내 질문은 기본적으로 스레드를 Excel 클래스와 단단히 연결하는 것이 좋습니다.
Jetti

0

별도의 클래스를 사용하여 UI를 백그라운드 작업과 분리합니다. 그렇게하면 우려가 분리됩니다. UI 코드와 비즈니스 로직을 혼용해서는 안됩니다.


분명히 말하면, 내 수업은 UI를 건드리지 않습니다. 필요한 경우 UI를 업데이트하는 데 사용할 수있는 두 가지 이벤트가 있지만 클래스 자체는 UI를 건드리지 않습니다.
Jetti

0

BackgroundWorkers에 대해 내가 기억하는 것은 UI에 진행 업데이트를 보내는 기능과 같은 여러 가지 편리한 방법을 제공한다는 것입니다. 하지만 다른 클래스에서는 사용할 수 없다는 규칙은 없습니다.

또한 항목을 특정 순서로 처리하지 않아도되는 반복 작업을 수행하는 경우 ThreadPool을 대신 사용하십시오 (또는 .NET 4를 사용하는 경우 작업 병렬 라이브러리 사용 ).


답변 주셔서 감사합니다. 클래스에 진행률을 트리거하는 두 개의 이벤트를 만들었습니다 (기본적으로 BackgroundWorker가 비공개이므로 BackgroundWorker 진행률 이벤트를 래핑). 진행률을 UI (진행률 표시 줄)로 보냅니다.
Jetti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.