아래 코드를 실행하려고하면 동기 작업을 수행하십시오.왜?
나는 다음과 같은 경고를 받는다.
경고 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);
}
}
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); });
}
}
이 예제를 실제 프로덕션 시스템에 작성했습니다. 엔티티를 데이터베이스에 저장하면 시간이 걸릴 수 있습니다. 이 우아한 시뮬레이션을보세요.
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());
}
}