2

아래 코드를 실행하려고하면 동기 작업을 수행하십시오.왜?

나는 다음과 같은 경고를 받는다.

경고 1이 비동기 메서드는 'await'연산자가없고 동기식으로 실행됩니다. 'await'연산자를 사용하여 비 차단 API 호출을 기다리거나 'await Task.Run (...)'을 사용하여 백그라운드 스레드에서 CPU 바운드 작업을 수행하는 것이 좋습니다.

private async void btProcessa_Click(object sender, EventArgs e)
{
    await ProcessaA();
    await ProcessaB();
}

public async Task ProcessaA()
{
    for (int i = 0; i <= 100; i++)
    {
        pbProcessoA.Value = i;
        Thread.Sleep(500);
    }
}

public async Task ProcessaB()
{
    for (int i = 0; i <= 100; i++)
    {
        pbProcessoB.Value = i;
        Thread.Sleep(500);
    }
}


2 답변


10

async"이 코드를 백그라운드 스레드에서 실행"하는 것은 아닙니다. 더 많은 것을 알고 싶다면async, 나는입문 블로그 게시물,MSDN 문서대단하다.작업 기반 비동기 패턴 전체 안내서.

I / O 바인딩 (또는 이벤트 기반) 연산의 일부 시뮬레이션을 수행하려면Task.Delay대신에Thread.Sleep:

public async Task ProcessaA()
{
  for (int i = 0; i <= 100; i++)
  {
    pbProcessoA.Value = i;
    await Task.Delay(500);
  }
}

CPU 바운드 작업을 시뮬레이트하려면 다음을 통해 백그라운드 작업으로 푸시해야합니다.Task.Run:

public async Task ProcessaA()
{
  for (int i = 0; i <= 100; i++)
  {
    pbProcessoA.Value = i;
    await Task.Run(() => { Thread.Sleep(500); });
  }
}



2

이 예제를 실제 프로덕션 시스템에 작성했습니다. 엔티티를 데이터베이스에 저장하면 시간이 걸릴 수 있습니다. 이 우아한 시뮬레이션을보세요.

class TestAsyncAwait
{
    public void GetEntities()
    {
        for (int i = 0; i < 4; i++)
        {
            var a = getEntities(i);
            saveEntitiesAsync(a);
        }
        Console.WriteLine("\nPress any key to close\n");
        Console.ReadKey();
    }

    private List<string> getEntities(int i)
    {
        Console.Write("getting Entities for id={0}...", i);
        Thread.Sleep(2000);
        var r = new List<string> { i.ToString(), " Hello!" };
        Console.WriteLine("done, has the Entities for id={0}\n", i);
        return r;
    }

    async void saveEntitiesAsync(List<string> a)
    {
        var sb = new StringBuilder();
        await Task.Run(() =>
        {
            Thread.Sleep(4000); // simulates long task
            foreach (string s in a) sb.Append(s);
        });
        // shows the thread in action
        Trace.WriteLine("saved: " + sb.ToString());
    }
}

연결된 질문


관련된 질문

최근 질문