मैं कुछ समय के लिए कोशिश कर रहा हूँ मुझे लगा कि कुछ आसान होगा। .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)क्योंकि बिना किसी प्रतीक्षा कीवर्ड के आपकी स्लीप विधि समकालिक है।