ฉันพยายามมาระยะหนึ่งแล้วเพื่อหาสิ่งที่ฉันคิดว่าจะใช้งานได้ง่ายกับ. NET 4.5
ฉันต้องการปิดงานสองงานที่ทำงานเป็นเวลานานในเวลาเดียวกันและรวบรวม
ผลลัพธ์ด้วยวิธี C # 4.5 (RTM) ที่ดีที่สุด
ต่อไปนี้ใช้งานได้ แต่ฉันไม่ชอบเพราะ:
- ฉันต้องการ
Sleep
เป็นวิธี async เพื่อให้สามารถใช้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>
โดยการเรียกใช้async
เมธอดดังนั้นฉันจึงสามารถเรียกStart()
ใช้งานทั้งสองได้ แต่ฉันคิดไม่ออกว่าจะTask<T>
เรียกวิธีการ async ได้อย่างไร
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
ไม่ได้var task1 = Sleep(5000)
เนื่องจากวิธีการนอนหลับของคุณได้โดยไม่ต้องรอคอยคำหลักคือซิงโคร