>  기사  >  백엔드 개발  >  C# 기본 검토 비동기 반환 유형

C# 기본 검토 비동기 반환 유형

黄舟
黄舟원래의
2017-02-07 15:08:481889검색

서문


블로거는 단순히 자신이 게시한 비동기 기사를 세어보았는데, 간헐적으로 벌써 8개가 있습니다. 이번에는 비동기의 반환 유형을 사용하고 싶습니다. 예를 들어, 혼자 이야기하세요.

비동기 메서드에는 Taskb54c2c292509147c0b54128f4eb90887, Task 및 void라는 세 가지 반환 유형이 있습니다.

언제 어떤 반환 유형을 사용해야 합니까? 특정 상황에 따라 구체적인 분석이 필요합니다. 잘못 사용하면 프로그램의 실행 결과가 원하는 대로 나오지 않을 수도 있습니다. 상황에 따라 다른 반환 유형을 선택하는 방법에 대해 이야기해 보겠습니다.

Taskb54c2c292509147c0b54128f4eb90887

[기억] async 키워드를 추가할 때 후속 작업에 사용할 개체를 반환해야 하므로 Taskb54c2c292509147c0b54128f4eb90887를 사용하세요.

Task 반환 유형은 피연산자가 TResult 유형을 갖는 특정 비동기 메서드에 사용될 수 있습니다.

다음 예제에서 GetDateTimeAsync 비동기 메서드에는 현재 시간을 반환하는 return 문이 포함되어 있습니다. 따라서 메소드 선언은 Task9db9db54d21ae9db056aa10d2db0be56을 지정해야 합니다.

async Task<DateTime> GetDateTimeAsync()
{
    //Task.FromResult 是一个占位符,类型为 DateTime
    return await Task.FromResult(DateTime.Now);
}

GetDateTimeAsync 메서드 호출:

async Task CallAsync()
{
    //在另一个异步方法的调用方式
    DateTime now = await GetDateTimeAsync();
}

GetDateTimeAsync가 wait 식 내에서 호출되면 wait 식은 GetDateTimeAsync에서 반환된 작업에 저장된 DateTime 유형 값을 검색합니다.

async Task CallAsync()
{
    //在另一个异步方法的调用方式
    //DateTime now = await GetDateTimeAsync();
    //换种方式调用
    Task<DateTime> t = GetDateTimeAsync();
    DateTime now = await t;
}

GetDateTimeAsync 메서드는 CallAsync 메서드를 통해 호출되며, 즉시 대기하지 않는 GetDateTimeAsync 메서드에 대한 호출은 Task9db9db54d21ae9db056aa10d2db0be56을 반환합니다. 예제에서는 작업이 DateTime의 Task 변수에 할당됩니다. DateTime의 Task 변수는 Task9db9db54d21ae9db056aa10d2db0be56이므로 TResult 유형을 포함하는 DateTime 속성에 속합니다. 이 경우 TResult는 날짜 유형을 나타냅니다. Wait가 Task에 적용될 때, Wait 표현은 Task의 DateTime 속성의 내용으로 평가됩니다. 동시에 값이 now 변수에 할당됩니다.

이번에는 다양한 변수를 보여주므로 결과를 직접 비교할 수 있습니다.

async Task CallAsync()
{
    //在另一个异步方法的调用方式
    DateTime now = await GetDateTimeAsync();
    //换种方式调用
    Task<DateTime> t = GetDateTimeAsync();
    DateTime now2 = await t;
   //输出的结果对比
    Console.WriteLine($"now: {now}");
    Console.WriteLine($"now2: {now2}");
    Console.WriteLine($"t.Result: {t.Result}");
}

[참고] Result 속성은 잠긴 ​​속성입니다. 작업이 완료되기 전에 액세스하려고 하면 작업이 완료되고 값을 사용할 수 있을 때까지 현재 활성 스레드가 차단됩니다. 대부분의 경우 속성에 직접 액세스하는 대신 Wait를 사용하여 속성 값에 액세스해야 합니다.

태스크

return 문을 포함하지 않거나 피연산자를 반환하지 않는 return 문을 포함하는 비동기 메서드의 반환 유형은 일반적으로 Task입니다. 비동기적으로 실행되도록 작성된 경우 이러한 메서드는 무효 반환 메서드가 됩니다. 비동기 메서드에서 Task 반환 형식을 사용하는 경우 호출 메서드는 호출된 비동기 메서드가 완료될 때까지 호출자의 완료를 일시 중지하기 위해 wait 연산자를 사용할 수 있습니다.

예 보기:

async Task DelayAsync()
{
    //Task.Delay 是一个占位符,用于假设方法正处于工作状态。
    await Task.Delay(100);
    Console.WriteLine("OK!");
}

wait 식 대신 wait 문을 사용하여 DelayAsync 메서드를 호출하고 기다립니다. 이는 void를 반환하는 메서드에 대한 호출 문과 유사합니다. 이 경우 Wait 연산자를 적용해도 값이 생성되지 않습니다.

DelayAsync를 호출하는 예를 살펴보세요.

//调用和等待方法在同一声明中
await DelayAsync();

이제 호출과 대기를 분리하는 방법을 사용합니다.

//分离
Task delayTask = DelayAsync();
await delayTask;        
void

void 반환 유형은 void 반환 유형이 필요한 이벤트 핸들러에서 주로 사용됩니다. void 반환 유형은 void를 반환하는 메서드 또는 호출 후 잊어버리기 활동으로 분류될 수 있는 활동을 수행하는 메서드에 대한 대안으로 사용될 수도 있습니다. 그러나 void를 반환하는 비동기 메서드를 기다릴 수 없으므로 가능할 때마다 Task를 반환해야 합니다. 이러한 메서드의 호출자는 호출된 비동기 메서드가 완료될 때까지 기다리지 않고 완료만 진행할 수 있으며, 호출자는 비동기 메서드에 의해 생성된 모든 값이나 예외로부터 독립되어야 합니다.

void를 반환하는 비동기 메서드 호출자는 메서드에서 발생한 예외를 포착할 수 없으며 이러한 처리되지 않은 예외로 인해 애플리케이션 오류가 발생할 수 있습니다. Task 또는 Taskb54c2c292509147c0b54128f4eb90887를 반환하는 비동기 메서드에서 예외가 발생하는 경우, 예외는 반환된 작업에 저장되고 해당 작업을 기다리는 동안 다시 발생합니다. 따라서 예외를 발생시킬 수 있는 비동기 메서드의 반환 유형이 Task 또는 Taskb54c2c292509147c0b54128f4eb90887인지 확인하고 이러한 메서드에 대한 호출이 대기되는지 확인하세요.

이제 예외도 Wait를 사용할 수 있습니다. "C#의 과거와 현재를 되돌아보기 - C# 6.0의 새로운 구문 기능 확인"으로 이동하세요.

void 반환 값 예:

private async void button1_Click(object sender, EventArgs e)
{
    //启动进程并等待完成
    await Task.Delay(100);
}

위는 Async 반환 유형에 대한 C# 기본 검토입니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트(www.php.cn)를 참고하세요. !


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:C# 확장 방법 분석다음 기사:C# 확장 방법 분석