추악한 메서드입니다 취소 할 필요 없이 간편하게 만드는 방법도 있다.

나는 현재 개조 과정에서 우리 방식에 대해 취소 할. 나는 사용하려는 시스템스트레이딩스타스크s.칸첼라티온트킨 구현할 수 있는.

일반적으로 몇 단계를 lionbridge 메서드을 오랜기간 수행 (파견 명령을 기다리고 하드웨어에는 다음 주로) (예:

void Run()
{
    Step1();
    Step2();    
    Step3();
}

내 첫 번째 (아마 멍청한) 에 대한 생각을 바꿀 것이라고 이 취소

bool Run(CancellationToken cancellationToken)
{
    Step1(cancellationToken);

    if (cancellationToken.IsCancellationRequested)
        return false;

    Step2(cancellationToken);

    if (cancellationToken.IsCancellationRequested)
        return false;    

    Step3(cancellationToken);

    if (cancellationToken.IsCancellationRequested)
        return false;

    return true;
}

솔직히 있는 개판이예염 보입니다. 이 &quot pattern"; 단일 단계 안에 계속 진행될 것이라고, 고쳐주렴 (반드시 기름 한 것이 아니라, 이들이 이미). 이 아니라, 비록 그러니까말이야 트레더드보르트 여바바 섹시 수 있을 것 () 는 사용하지 않는 것이 좋습니다.

이를 알아주지 않는 응용 프로그램이 있나요 패턴화합니다 숨기십시오 빼냅니다 그 논리를 많은 상용구 코드?

  • 편집할지 *

예를 들어, 이 단계를 '방법' 의 성격을 실행하십시오 읽을 수 있었다

void Run()
{
    GiantRobotor.MoveToBase();
    Oven.ThrowBaguetteTowardsBase();    
    GiantRobotor.CatchBaguette();
    // ...
}

우리는 다른 하드웨어 장치를 제어하는 데 필요한 동기화됨 함께 사용할 수 있습니다.

질문에 대한 의견 (10)
해결책

하지만, 데이터 흐름 내의 대한 이네프수드 경우 단계는 짐작이지만요. # 39, t matter, 병렬 실행할 수 있는 방법을 can& 다음 판독값 외곽진입 더 적합할 수 있습니다.

void Run()
{
    // list of actions, defines the order of execution
    var actions = new List() {
       ct => Step1(ct),
       ct => Step2(ct),
       ct => Step3(ct) 
    };

    // execute actions and check for cancellation token
    foreach(var action in actions)
    {
        action(cancellationToken);

        if (cancellationToken.IsCancellationRequested)
            return false;
    }

    return true;
}

39, 필요한 경우 don& 건의할 수 있기 때문에 그 단계를 t 까지 분할합니다 토큰인지 더 작은 목록을 작성할 수도 있습니다, 작은 단위 정의:

var actions = new List() {
    Step1, Step2, Step3
};
해설 (4)

연속 어때?

var t = Task.Factory.StartNew(() => Step1(cancellationToken), cancellationToken)
   .ContinueWith(task => Step2(cancellationToken), cancellationToken, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.Current)
   .ContinueWith(task => Step3(cancellationToken), cancellationToken, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.Current);
해설 (2)

39 는 사용할 수 있지만, 내가 인정해 isn& 도함을 예쁜 t do what you have done.

if (cancellationToken.IsCancellationRequested) { /* Stop */ }

이어 약간 짧다.

cancellationToken.ThrowIfCancellationRequested()

일반적으로 개별 단계를 통과할 수 있다면, 당신은 토큰인지 취소 등 확산시킬 수 있다는 게 많으면 체크 아웃하지 don& # 39, 코드. 취소 constantly 확인할지 않도록 선택할 수도 있습니다. # 39 는 멱등 및 aren& 작업 수행 중인 경우, t, t # 39 리소스에는 집약형에 전날에약혼자에게 don& 반드시 취소 모든 단계에서 확인할 수 있다. 가장 중요한 시기 복귀하기 전에 검사를 한 결과.

39 의 경우, 해당 단계를 you& 반군지역 토큰인지 할 수 있는 모든 사람들이 이 같은 일이.

public static CancellationToken VerifyNotCancelled(this CancellationToken t) {
    t.ThrowIfCancellationRequested();
    return t;
}

...

Step1(token.VerifyNotCancelled());
Step2(token.VerifyNotCancelled());
Step3(token.VerifyNotCancelled());
해설 (2)

When I do it like that, 내가 만든 사람에게 뭔가 해야 했다.

bool Run(CancellationToken cancellationToken)
{
    var DoIt = new Func((f) =>
    {
        f(cancellationToken);
        return cancellationToken.IsCancellationRequested;
    });

    if (!DoIt(Step1)) return false;
    if (!DoIt(Step2)) return false;
    if (!DoIt(Step3)) return false;

    return true;
}

전혀 있을 경우, 또는 단계를 간에 코드를 작성할 수 있습니다.

return DoIt(Step1) && DoIt(Step2) && DoIt(Step3);
해설 (0)

파선-짧은 버전:

' ()' ' ()' 와 전화 통화를 사용하는 잠급니다 동기화하려면 트레더드보르트 중요한 단면에는.

Let me 설명하란말야 버전:

일반적으로 중단, d, s # 39 thread& you& # 39 고려해야 할 때 두 가지 유형의 코드:

  • T really care 마칠 경우 긴 실행 중인 코드에 don& # 39 있습니다.
  • 코드를 실행할 수 있는 # 39 의 과정이든 it& nnt 있다.

첫 번째 유형은 유형: 저희에게는힘과 don& # 39, t care about 사용자가 요청되었습니다 중지-중지 아마 우린 알파 (α) 를 100 억 t care doesn& # 39, 그는 더 이상?

39 we& 사용할 경우, d ',' 센티넬 캔셀라티온트킨 등 각 이터레이션입니다 중요하지 않은 코드를 힘들 것이라고 우리는? 우리는 테스트합니다.

for(long i = 0; i < bajillion; i++){
    if(cancellationToken.IsCancellationRequested)
        return false;
    counter++;
}

그래서 않았다는거지 따라서 이러한 경우에는 '트레더드보르트 ()' 은 갓센드.

특히 일부 경우, t # 39 라고 죄송합니다. can& 사용할 수 있는 코드 () 는 '핵' 트레더드보르트 슬픔으로창백해지고 nnt 실행하십시오! 행동 양식, 지금 이 회사는 이미 돈을 빼서 입금합니다 완료하십시오 돈 거래 및 전송하십시오 타겟으로의 빠르시니라 돈을 좋아하는 아니예 사라지고 있다.

다행히 우리는 이런 종류의 상호 배제 도와줄 수 있는 일이다. C # 과 꽤 있습니다.

//unimportant long task code
lock(_lock)
{
    //atomic task code
}

및 다른

lock(_lock) //same lock
{
    _thatThread.Abort();
}

많은 수가 있기 때문에, 항상 '=' 센티넬 잠급니다 &lt you& 수 있는 게 너무 중요하지 않은 코드를; d # 39 센티넬 (이를 위해 중단 빠름). 따라서 코드를 센티넬 보다 약간 더 예뻐 중단, t # 39 는 버전 있지만, 이는 또한 doesn& 기다려야 하기 때문에 중요하지 않다는 것을.

실제로 '도 될 수 있는 경우에도' 마지막으로 '블록' 트레아드보르테스세페시옹 뚜르산을 어디든요. 이 때문에 최근 논란이 되고 있는 '예측 불가능' () 는 트레더드보르트.

이러한 문제를 방지할 수 있는 '전체' try catch 마지막으로 단 잠금식 you& 잠급니다 # 39, d 블록. 그 후, 마지막으로 '는' 에서 지우는중 에센셀 블록 전체를 차단할 수 있습니다. 일반적으로 '블록' 시도하시겠습니까 최대한 짧게 한 줄 수 있게, 불필요한 코드 때문에, 우리는 대부분 aren& # 39, t 잠금식.

따라서 트레더드보르트 () ',' 때 조금 덜 말하도다 이글거리. 원치 않는 to call it on the ᅴ 스레드할 표시되어도 you& # 39, re 이제 같이 잠금식 거잖나.

해설 (0)

이 경우, 리팩터링 리팩터링 허용되는 등 한 가지 방법은 '단계 단계 메서드을 있을 수 있습니다 (int 번호임)'.

그런 다음 1 부터 N 과 확인란 경우 한 번만 요청되었습니다 취소 토큰인지 반복하고 있다.

bool Run(CancellationToken cancellationToken) {
    for (int i = 1; i < 3 && !cancellationToken.IsCancellationRequested; i++) 
        Step(i, cancellationToken);

    return !cancellationToken.IsCancellationRequested;
}

또는, 가리킨다. (둘 중 더 많이 있습니다)

bool Run(CancellationToken cancellationToken) {
    for (int i = 1; i < 3; i++) {
        Step(i, cancellationToken);
        if (cancellationToken.IsCancellationRequested)
            return false;
    }
    return true;
}
해설 (2)

할 수 있습니다 (take a look at [Apple& # 39 의 산퍼이션 패턴화합니다] (https://developer.apple.com/library/ios/documentation/cocoa/reference/NSOperation_class/Reference/Reference.html) 예로 들 수 있습니다. # 39 의 취소 할 수 있지만, 더 복잡하게 만드는 방법은 단지 it& it& # 39 의 예쁜 가리킨다.

해설 (0)

나는 할 수 없는 이 길을 취급료 표준, 내장, 작은 것을 제안했습니다.

bool Run(CancellationToken cancellationToken)
{        
    //cancellationToke.ThrowIfCancellationRequested();

    try
    {
        Step1(cancellationToken);
        Step2(cancellationToken);
        Step3(cancellationToken);
    }
    catch(OperationCanceledException ex)
    {
        return false;
    }

    return true;
}

void Step1(CancellationToken cancellationToken)
{
    cancellationToken.ThrowIfCancellationRequested();
    ...
}

39 더 의존하고 싶지 않다, 일반적으로 너회가 don& 추진하는 한편, 이 경우는 이미 확인한 수준을 한 단계 동의하십시오 캔셀라티온트킨 및 있어야 확인란 어쨌든 이와 같은 방법을 모든 비 사소한 캔셀라티온트킨 수락 한다).

이 검사는 통해 필요에 따라 세분화된 또는 비 과립 형태로 수도 있습니다, 즉 그들은곧 실행 / 집약형에 운영체.

해설 (0)