누군가 이것이 동기 방식으로 무엇을 의미하는지 설명 할 수 있습니까? 내가 방법을 변경하려고하면 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
}
마찬가지로, 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
답변
비동기 키워드를 추가하는 것은 상태 머신의 작성을 단순화하기 위해 구문 설탕입니다. 본질적으로 컴파일러는 코드를 가져옵니다.
public async Task MethodName()
{
return null;
}
그리고 그것을 바꿉니다.
public Task MethodName()
{
return Task.FromResult<object>(null);
}
코드에 await
키워드 가있는 경우 컴파일러는 메소드를 가져 와서이를 실행하는 데 필요한 상태 머신을 나타내는 클래스로 변환해야합니다. 각 await
키워드에서 변수의 상태와 스택은 클래스의 필드에 보존되며 클래스는 대기중인 작업에 완료 후크로 추가 된 다음 반환됩니다.
해당 작업이 완료되면 작업이 다시 실행됩니다. 따라서 변수의 상태를 복원하고 코드의 다음 슬래브로 이동하기 위해 메소드 상단에 일부 추가 코드가 추가됩니다.
async & await는 무엇을 생성합니까?를 참조하십시오 . 까다로운 예를 들어.
이 프로세스는 컴파일러가 yield 문으로 반복자 메서드를 처리하는 방식과 많은 공통점이 있습니다.
답변
이것은 String 유형의 작업을 반환하는 작업입니다 (C # 익명 함수 또는 다른 말로 위임이 ‘Func’사용됨).
public static async Task<string> MyTask()
{
//C# anonymous AsyncTask
return await Task.FromResult<string>(((Func<string>)(() =>
{
// your code here
return "string result here";
}))());
}
답변
비동기 메소드에서 올바른 응답을 다시 얻으려면 해당 태스크 메소드를 호출하는 동안 대기해야합니다. 작업 유형이 아닌 반환 값 유형으로 다시 변환되기를 기다립니다.
예를 들어 var content = await StringAsyncTask (
여기서 public async Task < String > StringAsyncTask ())