나는 현재 개조 과정에서 우리 방식에 대해 취소 할. 나는 사용하려는 시스템스트레이딩스타스크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;
}
솔직히 있는 개판이예염 보입니다. 이 " pattern"; 단일 단계 안에 계속 진행될 것이라고, 고쳐주렴 (반드시 기름 한 것이 아니라, 이들이 이미). 이 아니라, 비록 그러니까말이야 트레더드보르트 여바바 섹시 수 있을 것 () 는 사용하지 않는 것이 좋습니다.
이를 알아주지 않는 응용 프로그램이 있나요 패턴화합니다 숨기십시오 빼냅니다 그 논리를 많은 상용구 코드?
예를 들어, 이 단계를 '방법' 의 성격을 실행하십시오 읽을 수 있었다
void Run()
{
GiantRobotor.MoveToBase();
Oven.ThrowBaguetteTowardsBase();
GiantRobotor.CatchBaguette();
// ...
}
우리는 다른 하드웨어 장치를 제어하는 데 필요한 동기화됨 함께 사용할 수 있습니다.
하지만, 데이터 흐름 내의 대한 이네프수드 경우 단계는 짐작이지만요. # 39, t matter, 병렬 실행할 수 있는 방법을 can& 다음 판독값 외곽진입 더 적합할 수 있습니다.
void Run()
{
// list of actions, defines the order of execution
var actions = new List<Action<CancellationToken>>() {
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;
}
var actions = new List<Action>() {
Step1, Step2, Step3
};
연속 어때?
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);
if (cancellationToken.IsCancellationRequested) { /* Stop */ }
이어 약간 짧다.
cancellationToken.ThrowIfCancellationRequested()
일반적으로 개별 단계를 통과할 수 있다면, 당신은 토큰인지 취소 등 확산시킬 수 있다는 게 많으면 체크 아웃하지 don& # 39, 코드. 취소 constantly 확인할지 않도록 선택할 수도 있습니다. # 39 는 멱등 및 aren& 작업 수행 중인 경우, t, t # 39 리소스에는 집약형에 전날에약혼자에게 don& 반드시 취소 모든 단계에서 확인할 수 있다. 가장 중요한 시기 복귀하기 전에 검사를 한 결과.
public static CancellationToken VerifyNotCancelled(this CancellationToken t) {
t.ThrowIfCancellationRequested();
return t;
}
...
Step1(token.VerifyNotCancelled());
Step2(token.VerifyNotCancelled());
Step3(token.VerifyNotCancelled());
When I do it like that, 내가 만든 사람에게 뭔가 해야 했다.
bool Run(CancellationToken cancellationToken)
{
var DoIt = new Func<Action<CancellationToken>,bool>((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);
' ()' ' ()' 와 전화 통화를 사용하는 잠급니다 동기화하려면 트레더드보르트 중요한 단면에는.
일반적으로 중단, d, s # 39 thread& you& # 39 고려해야 할 때 두 가지 유형의 코드:
첫 번째 유형은 유형: 저희에게는힘과 don& # 39, t care about 사용자가 요청되었습니다 중지-중지 아마 우린 알파 (α) 를 100 억 t care doesn& # 39, 그는 더 이상?
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();
}
많은 수가 있기 때문에, 항상 '=' 센티넬 잠급니다 < you& 수 있는 게 너무 중요하지 않은 코드를; d # 39 센티넬 (이를 위해 중단 빠름). 따라서 코드를 센티넬 보다 약간 더 예뻐 중단, t # 39 는 버전 있지만, 이는 또한 doesn& 기다려야 하기 때문에 중요하지 않다는 것을.
실제로 '도 될 수 있는 경우에도' 마지막으로 '블록' 트레아드보르테스세페시옹 뚜르산을 어디든요. 이 때문에 최근 논란이 되고 있는 '예측 불가능' () 는 트레더드보르트.
이러한 문제를 방지할 수 있는 '전체' try catch 마지막으로 단 잠금식 you& 잠급니다 # 39, d 블록. 그 후, 마지막으로 '는' 에서 지우는중 에센셀 블록 전체를 차단할 수 있습니다. 일반적으로 '블록' 시도하시겠습니까 최대한 짧게 한 줄 수 있게, 불필요한 코드 때문에, 우리는 대부분 aren& # 39, t 잠금식.
따라서 트레더드보르트 () ',' 때 조금 덜 말하도다 이글거리. 원치 않는 to call it on the ᅴ 스레드할 표시되어도 you& # 39, re 이제 같이 잠금식 거잖나.
이 경우, 리팩터링 리팩터링 허용되는 등 한 가지 방법은 '단계 단계 메서드을 있을 수 있습니다 (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;
}
나는 할 수 없는 이 길을 취급료 표준, 내장, 작은 것을 제안했습니다.
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();
...
}
이 검사는 통해 필요에 따라 세분화된 또는 비 과립 형태로 수도 있습니다, 즉 그들은곧 실행 / 집약형에 운영체.