IT story

비동기 대기 반환 작업

hot-time 2020. 8. 7. 07:53
반응형

비동기 대기 반환 작업


누군가 이것이 동기식 메서드에서 이것이 무엇을 의미하는지 설명 할 수 있습니까? 방법을 변경하려고하면 asyncVS가 그것에 대해 불평합니다.

이것은 작동합니다 :

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

작동하지 않습니다.

public async Task MethodName()
{
     return Task.FromResult<object>(null);
}

그래서 기본적으로 이것이 정확히 무엇을 의미하는지 알고 싶습니다. Task.FromResult<object>(null);


async방법은 일반적인 방법과 다릅니다. async메서드 에서 반환 하는 모든 항목은 Task.

값 (void)을 반환하지 않으면 래핑되고 Task, 반환 int하면 래핑 Task<int>됩니다.

당신의 비동기 방식 반환해야 할 경우 int당신은 메소드의 반환 유형을 표시 할 것입니다 Task<int>그리고 당신은 일반 돌아갑니다 int아닙니다 Task<int>. 컴파일러는 변환됩니다 int에를 Task<int>당신을 위해.

private async Task<int> MethodName()
{
    await SomethingAsync();
    return 42;//Note we return int not Task<int> and that compiles
}

Sameway, 반환 Task<object>메서드의 반환 유형은Task<Task<object>>

public async Task<Task<object>> MethodName()
{
     return Task.FromResult<object>(null);//This will compile
}

메서드가을 Task반환하므로 값을 반환해서는 안됩니다. 그렇지 않으면 컴파일되지 않습니다.

public async Task MethodName()
{
     return;//This should work but return is redundant and also method is useless.
}

await문이없는 비동기 메서드 async.


async를 사용할 때 await 키워드를 사용해야하며 함수 반환 유형은 일반이어야합니다. 반환 값이있는 예는 다음과 같습니다.

public async Task<object> MethodName()
{
    return await Task.FromResult<object>(null);
}

다음은 반환 값이없는 예입니다.

public async Task MethodName()
{
    await Task.CompletedTask;
}

다음을 읽으십시오 :

TPL : http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx 및 작업 : http://msdn.microsoft.com/en-us/library/system.threading .tasks (v = vs.110) .aspx

비동기 : http://msdn.microsoft.com/en-us/library/hh156513.aspx 대기 : http://msdn.microsoft.com/en-us/library/hh156528.aspx


async 키워드를 추가하는 것은 상태 머신 생성을 단순화하기위한 구문 적 설탕 일뿐입니다. 본질적으로 컴파일러는 코드를 가져옵니다.

public async Task MethodName()
{
     return null;
}

그리고 그것을로 바꿉니다.

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

코드에 await키워드 가있는 경우 컴파일러는 메서드를 실행하는 데 필요한 상태 시스템을 나타내는 클래스로 변환해야합니다. await키워드에서 변수의 상태와 스택은 클래스의 필드에 보존되고 클래스는 대기중인 작업에 대한 완료 후크로 추가 된 다음 반환됩니다.

해당 작업이 완료되면 작업이 다시 실행됩니다. 따라서 변수 상태를 복원하고 코드의 다음 슬래브로 이동하기 위해 메서드 맨 위에 추가 코드가 추가됩니다.

비동기 및 대기는 무엇을 생성합니까?를 참조하십시오 . 피투성이의 예를 들어.

This process has a lot in common with the way the compiler handles iterator methods with yield statements.


    public static async Task<string> MyTask()
    {
        //C# anonymous AsyncTask
        return await Task.FromResult<string>(((Func<string>)(() =>
        {
            // your code here
            return  "string result here";

        }))());
    }

참고URL : https://stackoverflow.com/questions/25191512/async-await-return-task

반응형