비동기 대기 반환 작업
누군가 이것이 동기식 메서드에서 이것이 무엇을 의미하는지 설명 할 수 있습니까? 방법을 변경하려고하면 async
VS가 그것에 대해 불평합니다.
이것은 작동합니다 :
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
'IT story' 카테고리의 다른 글
TypeScript를 사용한 개방형 함수 인수 (0) | 2020.08.07 |
---|---|
JsonRequestBehavior를 AllowGet으로 설정할 때 어떤 '민감한 정보'가 공개 될 수 있습니까? (0) | 2020.08.07 |
React Native에서 동적 스타일을 만들 수 있습니까? (0) | 2020.08.07 |
배열에서 값의 인덱스 찾기 (0) | 2020.08.07 |
WordPress는 홈페이지를 제외한 모든 페이지에서 404 페이지를 찾을 수 없습니다. (0) | 2020.08.07 |