.NET 4.5로 작업하는 것이 간단하다고 생각한 것을 얻으려고 잠시 노력해 왔습니다.
두 개의 장기 실행 작업을 동시에 시작하고
최상의 C # 4.5 (RTM) 방식으로 결과를 수집하고 싶습니다.
다음은 작동하지만 나는 그것을 좋아하지 않습니다.
- 다른 방법을
Sleep
사용할 수 있도록 비동기 메서드가 되고 싶습니다.await
- 그냥 서투르게 보입니다.
Task.Run()
- 나는 이것이 새로운 언어 기능을 전혀 사용하지 않는다고 생각합니다!
작동 코드 :
public static void Go()
{
Console.WriteLine("Starting");
var task1 = Task.Run(() => Sleep(5000));
var task2 = Task.Run(() => Sleep(3000));
int totalSlept = task1.Result + task2.Result;
Console.WriteLine("Slept for a total of " + totalSlept + " ms");
}
private static int Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
Console.WriteLine("Sleeping for " + ms + " FINISHED");
return ms;
}
작동하지 않는 코드 :
업데이트 : 이것은 실제로 작동하며 올바른 방법입니다. 유일한 문제는 Thread.Sleep
이 코드는 호출이 Sleep(5000)
즉시 작업 실행을 시작하기 때문에 Sleep(1000)
작동하지 않으므로 완료 될 때까지 실행되지 않습니다. 이것은 사실 이며 너무 빨리 사용 하거나 전화 하지 않더라도 마찬가지 Sleep
입니다 .async
await
.Result
두 작업 을 호출 할 수 있도록 메서드 Task<T>
를 호출하여 실행되지 않는 방법이있을 수 있다고 생각 했지만 비동기 메서드를 호출하여 a를 얻는 방법을 알 수 없습니다 .async
Start()
Task<T>
public static void Go()
{
Console.WriteLine("Starting");
var task1 = Sleep(5000); // blocks
var task2 = Sleep(1000);
int totalSlept = task1.Result + task2.Result;
Console.WriteLine("Slept for " + totalSlept + " ms");
}
private static async Task<int> Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
return ms;
}
task1.Result
not at 에서 차단이 발생 var task1 = Sleep(5000)
합니다.