Unity 21.04.28. 개념복습
**Synchronous(동기의, 동시성의)
*동기함수는 실행이 모두 완료되면 결과를 출력한다.
ㄴ동기적 시행(Synchronous Operation)은 동시 또는 순차적으로 실행함을 의미한다.
ㄴ요청과 결과가 한 자리에서 동시에 일어난다. = 요청을 하면 시간이 얼마나 걸리던 결과가 나올때까지 기다려야한다.
**Asynchronous(비(非)동기의, 비(非)동시성의)
*비동기 함수는 메서드가 호출된 후 메서드의 완료를 대기하지 않고 바로 다음 동작을 수행한다.
ㄴ메서드 호출이 실행되는 동안 애플리케이션이 다른 작업을 계속할 수 있기 때문에 사용한다.
= 더 효율적으로 작업을 할 수 있다.
---------------C# docs
ㄴC#에서 구현하는데는 3가지 패턴이 있다.
-작업 기반 비동기패턴
-이벤트 기반 비동기패턴
-IAsyncResult 비동기 패턴
>>이 중 작업 기반 비동기패턴이 가장 쉽고 단순하기때문에 가장 선호된다. 사용방법은 메서드의 작업을 구현하고 반환형식으로 작업을 지정한다.<T>를 사용. 여기서 T는 논리 연산에서 반환되는 형식이다.
ex)public async Task<string> SampleMethod(){}
>>이벤트 기반 비동기패턴은 MethodNameAsync라는 작업이 하나 이상 존재한다. 이러한 메서드는 현재 쓰레드에서 동일한 작업을 수행하는 동기 버전을 미러링할 수 있다. 또한 이 클래스에는 MethodNameCompleted 이벤트가 있을 수 있고 MethodNameAsyncCancel 메서드가 있거나 단순히 CancelAsync 메서드가 존재할 수 있다. 작업을 호출하려는 클라이언트는 작업이 완료될 때 이벤트 처리기를 정의한다.
public class AsyncExample
{
// Synchronous methods.
public int Method1(string param);
public void Method2(double param);
// Asynchronous methods.
public void Method1Async(string param);
public void Method1Async(string param, object userState);
public event Method1CompletedEventHandler Method1Completed;
public void Method2Async(double param);
public void Method2Async(double param, object userState);
public event Method2CompletedEventHandler Method2Completed;
public void CancelAsync(object userState);
public bool IsBusy { get; }
// Class implementation not shown.
} //Microsoft docs
>>비동기 방식으로 .NET Framework 비동기 프로그래밍 패턴을 사용하여 서비스 작업을 구현하고 속성으로 설정하여 메서드를 표시할 수 있다. 일반적으로 시스템의 비동기 특성을 사용하는 경우 스레드에 대한 종속성을 사용하지 않아야한다. 작작업 디스패치 처리의 다양한 단계에 데이터를 전달하는 가장 안정적인 방법은 확장을 사용하는 것이다.
-클라이언트 애플리케이션에서 호출되는 방식에 관계없이 비동기적으로 실해오디는 계약작업x를 정의하려면
1. 패턴BeginOperation 및 EndOperation을 사용하여 두 개의 메서드를 정의하고
2. BeginOperation 메서드는 작업에 대한 in 및 ref 매개변수를 포함하고 IAsyncResult형식을 반환해야 한다.
3.EndOperation 메서드는 IAsyncResult 및 out 매개 변수 뿐만아니라 ref 매개변수도 포함하고 작업반환형식을 반환한다.
int DoWork(string data, ref string inout, out string outonly)
// MicrosoftDocs
이메서드를 비동기작업으로 만들면 아래처럼 된다.
[OperationContract(AsyncPattern=true)]
IAsyncResult BeginDoWork(string data,
ref string inout,
AsyncCallback callback,
object state);
int EndDoWork(ref string inout, out string outonly, IAsyncResult result);
// MicrosoftDocs
**Coroutine(코루틴 Co + routine)
*함수를 호출하면 반환값을 반환하기 전에 실행이 완료된다.
ㄴ함수에서 수행되는 작업은 하나의 프레임에서 수행된다는 것을 의미하고, 함수 호출은 절차적 애니메이션을 포함하거나 시간의 경과와 함께 일련의 이벤트에는 사용할 수 없다.
ㄴ반환 형식은 IEnumerator이며 실행은 StartCoroutine(코루틴 이름)을 사용한다.
ㄴ메서드 내에서 yield return을 반환해야한다.
ㄴyield return new WaitForSeconds(시간)을 통해 몇초동안 대기했다가 yield return아래 내용을 실행할 지 정해줄 수 있다.
ㄴ만약 대기하고 싶지 않고 매 프레임마다 실행시키고 싶다면 yield return null을 반환하면 된다.
다양한 다른 쓰임새는 아래 표를 참고하자.