.Net 4.5를 사용하는 경우 BackgroundWorker
대신 await
과 async
을 사용할 수 있습니다.
작업을 반환하는 async
메서드를 만들고이 메서드 내부에 Task.Run()
을 사용하여 배경 작업을 시작할 수 있습니다.
다음은 예입니다. 당신은 내가 댓글을 달았습니다 Task.Run()
에 전달 된 람다의 모든 느린 작업 "여기 모든 느린 작업을 수행"할 거라고 :
private async void btnProcess_Click(object sender, EventArgs e)
{
lblStatus.Text = "Please wait...";
await doSomeWorkAsynchronously();
lblStatus.Text = "Work completed";
}
private async Task doSomeWorkAsynchronously()
{
await Task.Run(()=>
{
// Do all your slow work here.
Thread.Sleep(5000); // Simulate slow work.
});
}
나는이 BackgroundWorker
를 사용하는 것보다 좀 더 쉽게 생각합니다.
참고 모든 "느린"방법이 있다면 이미 async
(예를 들어, 당신이 asynchronous file I/O를 사용하는 경우) 다음 방금 오히려 Task.Run()
를 통해 자신의 작업을 생성하는 것보다 당신의 비동기 작업의 await
각각 할 수 있습니다.
백그라운드 작업에서 값을 반환 할 수도 있습니다. 백그라운드 작업이 완료되었을 때 레이블을 업데이트 할 문자열을 반환한다고 가정합니다. 다음과 같이 할 수 있습니다.
private async void btnProcess_Click(object sender, EventArgs e)
{
lblStatus.Text = "Please wait...";
lblStatus.Text = await doSomeWorkAsynchronously();
}
private async Task<string> doSomeWorkAsynchronously()
{
return await Task.Run(()=>
{
// Do all your slow work here.
Thread.Sleep(5000); // Simulate slow work.
return "The task completed.";
});
}
GUI 스레드에서 장기 실행 태스크를 실행하지 마십시오. –
@SamLeach 그 제목에 질문에 대답 할 수는 있지만, 질문을 읽으면 그는 정말로'endl '에 대해 전혀 묻지 않습니다. –
'Timer' 또는'Thread'를 사용하면 다른 것을 볼 수 없습니다 – Abdullah