문제

내가 사용하고 모델의 보기-Presenter 패턴에 WinForms 프로젝트와 하나의 문제는(사)는 나는 때에 양식을 알려주는 발표자 무언가를 하고 다음이 유엔 반응하는 동안 발표자 간의 그것을 할 수 있습니다.다행히도 내에서 프로젝트 I 문제가 있으로 모든 발표자는 전화로 비동기 질문입니다 정확히 어떻게 할까?

해 각 발표자를 전에 싸여 새로운 스레드 생성?*

new Thread(()=>_presenter.DoSomething()).Start();

무엇 최고의 모범 사례요?어떤 경우에는 사용자 프레스는"중단 무엇을 하고 있"버튼?어떻게 정상적으로 중단?

.* 현실적으로 나는 아마 그냥 사용하여 어떤 종류의 프록시에 발표자는 이렇게하려면 오히려 두고 스레드 생성에 WinForm

도움이 되었습니까?

해결책

나만 주장할 수 있다는 생각했는데 이에 대한(사전 읽기 당신의 질문;).첫 번째 나는 장비는 장소이 실제로 사예를 들어,DB 접속 지어.는 곳이 있다면 실행하지 말아야 하는"UI"컨텍스트(당신이 그것을 저장할 수 있습니터 http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.current.aspx 에서는 UI 스레드와 비교 후 나중에 비 UI 동기화 컨텍스트)디버깅.BitchAndMoan()니다.더 이상 어떤 계산(는"해야한다"모든 것이 명확하게 구분에서 자신의 매니폴드,오른쪽)의 주장한다.

나는 당신에게 형식의 실행 발표자는 기능을 통해 구성 속성은 다음 순으로 기록합니다.(경우에 당신이 원하는 무언가에서 수행 시리얼 패션).

을 취소하는 작업이 실제로 발표자의 문제이지만,당신이에 대한 참조가 있어야 합 개체에 알리는 당신이 원하는 무엇을 중지합니다.면 프록시는 방법으로,다음을 선택할 수 있습까지 생성 스레드로 작업 목록과 함께 IAsyncResult 지만,그것은 여전히 문제하는 결정을 취소할 경우 동일한 행위가 허용되는 여러 번 호출합니다.그래서 당신을 공급해야 하는 작업에 적합한 호출-특정 이름을 시작할 때;는 의미한 방법으로 너무 많은 논리로 보 측->발표자에게 묻기를 사용자에게 문의 어느 하나의 작업을 처리해야 합니다.

내 경험에는 이것은 일반적으로 그냥 주위 사용하여 이벤트가(SCSF 스타일).를 하는 경우에 그것은 처음부터,나는 프록시는 방법이기 때문 SCSF 은 고통에서 많은 방법으로는 의심의 디자이너'정신입니다.

다른 팁

나는 보통 (현실적으로) 1 ~ 2 초 이상을 별도의 작업에 넣을 수있는 조치를 다음과 같은 것입니다.

public interface ITask
{
    void ExecuteTask (ITaskExecutionContext context);
    void AfterSuccess(ITaskExecutionContext context);
    void AfterFailure(ITaskExecutionContext context);
    void AfterAbortion(ITaskExecutionContext context);
}

또한 그러한 작업을 실행하는 데 대한 추상화도 있습니다.

public interface ITaskExecutor : IDisposable
{
    void BeginTask(ITask task);
    void TellTaskToStop();
}

이것의 구현 중 하나입니다 ITaskExecutor 사용 중입니다 BackgroundWorker:

public class BackgroundTaskExecutor : ITaskExecutor
{
    public void BeginTask(ITask task)
    {
        this.task = task;
        worker = new BackgroundWorker ();
        worker.DoWork += WorkerDoWork;
        worker.RunWorkerCompleted += WorkerRunWorkerCompleted;
        worker.WorkerSupportsCancellation = true;

        worker.RunWorkerAsync();
    }

    ...
}

나는 의존성 주입과 IOC에 크게 의존하여 물건을 함께 연결합니다. 발표자에서는 다음과 같은 것을 부릅니다.

GoAndDontReturnUntilYouBringMeALotOfMoneyTask task = new GoAndDontReturnUntilYouBringMeALotOfMoneyTask(parameters);
taskExecutor.BeginTask(task);

그런 다음 취소 / abort 버튼이 연결되어 작업 실행자 / 작업이 중단하도록 지시합니다.

실제로 여기에 제시된 것보다 조금 더 복잡하지만 이것이 일반적인 아이디어입니다.

사용하는 프록시 패턴을 두 번의 콜백을 수락하여 결과를 반환하거나 중단 시키십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top