나는 비동기 작업을 시작한 후에 자주 취소해야하는 짧은 비동기 작업이 있습니다. "작업"클래스에는 비동기 작업이 완료까지 실행되지 않고 취소되었음을 나타내는 데 편리 할 것이라고 생각되는 IsCanceled 표시기가 있습니다. 그러나 비동기 작업을 취소 된 것으로 표시하는 유일한 방법은 말할 수 있습니다. async 함수에 TaskCanceledException을 발생시킵니다. 비정상적으로 발생하는 상황을 나타 내기 위해 일상적으로 예외를 던지면 예외를 사용해야한다는 것을 이해하는 것에 어긋납니다. 누구든지 빈번하게 발생할 것으로 예상되는 비동기 작업을 취소 할 수있는 좋은 방법을 알고 있습니까? C# async CTP - 비동기 작업을 TaskCanceledException을 throw하지 않고 취소 된 것으로 표시하려면 어떻게합니까?
이class MightBeCanceled<T>
{
public readonly T Value;
public readonly bool IsCanceled;
public MightBeCanceled(T value) { Value = value; IsCanceled = false; }
public static MightBeCanceled<T> Canceled = new MightBeCanceled<T>(default(T), true);
private MightBeCanceled(T value, bool isCanceled) { Value = value; IsCanceled = isCanceled; }
}
...
static async Task<MightBeCanceled<int>> Foo()
{
if (someCancellationCondition)
return MightBeCanceled<int>.Canceled;
else
return new MightBeCanceled<int>(42);
}
static async void Bar()
{
var mightBeCanceled = await Foo();
if (mightBeCanceled.IsCanceled)
; // Take canceled action
else
; // Take normal action
}
그러나이 보인다 (나는 좋은 코딩 스타일 여기에 간결에 대한 관행을 무시했습니다) :
나의 다음-최선의 대안은 자신의 IsCanceled 숙박 시설의이 구조를 반환하는 것입니다 중복되고 사용하기가 더 어렵습니다. 그것은 IsCanceled가 2 개 (작업에 하나, MightBeCanceled에 하나) 있기 때문에 일관성 문제가 발생합니다.
누가 Foo를 취소하나요? CancellationToken을 사용하여 발신자가 취소 할 수 있어야합니다. –