c# await 사용 요약 정보


인공 자동 인터넷 뱅킹 이체를 모의하는 소프트웨어를 개발할 때 async+await를 대량으로 사용했다. 프로젝트가 성공적으로 출시되고 몇 가지 버전이 교체된 후에 await와 관련된 코드를 재구성했다. 현재의 구조는 더욱 뚜렷하고 확장성이 강하다.이 동시에 await의 사용도 초급에서 약간의 경험이 생겼다. 현재 이러한 경험을 다음과 같이 요약한다.
1 await와 async를 배합하여 사용합니다.가장 일반적인 애플리케이션은 다음과 같습니다.
다음 코드는 라인을 사용하지 않는 경우 winform은 5초의 무응답 상태에서 테스트박스에'테스트'를 표시하기 때문에 사용자 체험이 좋지 않습니다.
​
private string testString()
{

     Thread.Sleep(5000);

     return "test";

}

private async void btnGetAndTransfer_Click(object sender, EventArgs e)
{
    tbTextBox.text=testString();
}

​

아래의 코드는 전통적인threading기술을 사용하여textbox의 내용을 업데이트하는데 매우 복잡하고 코드를 유지하기 어렵다
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        new Thread(SampleFunction).Start();
    }

    public void SetTextBox(string value)
    {
        if (InvokeRequired)
        {
            this.Invoke(new Action(SetTextBox), new object[] {value});
            return;
        }
        textBox1.Text = value;
    }

    void SampleFunction()
    {

            Thread.Sleep(5000);
            SetTextBox("test");
            
    }
}

다음 코드는 await+async를 사용하여 첫 번째 코드의 기능을 실현하고 winform 동결 문제를 해결했습니다.코드의 구조로도 뚜렷하고 읽기 쉽다. 
private async Task testString()
{
      return await Task.Run(() =>
            {
                Thread.Sleep(5000);

                return "test";
            });
}

private async void btnGetAndTransfer_Click(object sender, EventArgs e)
{
    tbTextBox.text=await testString();
}

이상의 코드 예시를 보면 await+async는 문법사탕이지만 뚜렷한 장점이 있다.
2 await+async는 위에서 말한 장점이 있지만 대규모 사용은 신중해야 한다.
a 방법체에서 await를 사용하려면 방법도 반드시 async로 성명해야 한다. 다른 방법은 async를 성명하는 방법을 호출해야 한다. 또한 await를 사용해야 한다. await를 사용하지 않으면 호출된 방법에서 즉시 되돌아와 다음 코드를 계속 실행해야 한다. 호출된 async 방법이 실제 실행이 끝난 후에 다음 코드를 계속 실행하기를 기다리지 않는다.그러나 대부분의 경우 async 방법을 호출할 때 상대방이 실행한 후에 다음 코드를 계속 실행해야 한다. 그 결과 어떤 방법에서 await를 사용했기 때문에 전체 콜 Stack의method를 호출할 때 await+async가 필요하기 때문에 많은 코드가 await에 전염되었다.
b 코드에서 Action을 사용한 것은 설정 파일의 문자열에 대응하는 방법을 실행하기 위해서입니다.그러나 Action은templateclass로 async와 비async 방법을 동시에 호환할 수 없기 때문에 await 방법을 사용하면 따로 처리할 수 없습니다.(Action에서도 async 메서드를 사용할 수 있습니다. 참조:https://stackoverflow.com/questions/20624667/how-do-you-implement-an-async-action-delegate-method)
3 코드 전체의 구조 설계에서 만약에 매우 깊은 콜 Stack이 await를 사용한다면 사고방식을 바꿀 수 있다. 가장 안쪽 방법으로 라인을 시작하지 않고 라인의 코드를 가장 바깥쪽에 두면 대부분의 방법은 async로 수식할 필요가 없다. 방법은 정상적인 방식으로 개발할 수 있고 async를 새로운 모듈에 전염시키지 않을 것이다.
다시 말하면 async와 await는 UI와 가까운 곳에서 사용해야 하며 기본 기능의 코드에서 사용하지 말아야 한다.

좋은 웹페이지 즐겨찾기