मैं कुछ कोड है कि इस तरह की कुछ धीमी गति से काम करता है एक कार्य बनाता है:मैं एक कार्य कैसे बना सकता हूं जो शरीर के अंदर प्रतीक्षा करता है जो प्रतीक्षा के समय सिंक्रोनस संस्करण के समान व्यवहार करता है?
public static Task wait1()
{
return new Task(() =>
{
Console.WriteLine("Waiting...");
Thread.Sleep(10000);
Console.WriteLine("Done!");
});
}
वास्तविक कार्यान्वयन में, Thread.Sleep वास्तव में एक वेब सेवा कॉल किया जाएगा। मैं विधि का शरीर बदलना चाहता हूं इंतजार कर सकता हूं (इसलिए यह नेटवर्क एक्सेस/नींद के दौरान धागा का उपभोग नहीं करता है)। मेरा पहला प्रयास (संकलन त्रुटियों के शॉटगन-डीबगिंग के आधार पर) यह था:
public static Task wait2()
{
return new Task(async() =>
{
Console.WriteLine("Waiting...");
await Task.Delay(10000);
Console.WriteLine("Done!");
});
}
हालांकि; यह कार्य पहले जैसा ही व्यवहार नहीं करता है, क्योंकि जब मैं इसे कॉल करता हूं। वेट() पर; यह तुरंत लौटता है।
नीचे एक पूर्ण नमूना (कंसोल ऐप) है जो अंतर दिखा रहा है (दूसरा कार्य शुरू होने पर ऐप तुरंत खत्म हो जाएगा)।
मुझे ऐसा करने की क्या ज़रूरत है ताकि मैं स्टार्ट और प्रतीक्षा पर एक कॉल पर प्रतीक्षा कर सकूं जिसमें कोड के अंदर प्रतीक्षा करने के लिए कोड होता है? कार्यों को बाद में एक एजेंट द्वारा कतारबद्ध और निष्पादित किया जाता है, इसलिए यह महत्वपूर्ण है कि कार्य स्वतः शुरू नहीं हुआ है।
class Program
{
static void Main(string[] args)
{
var w1 = wait1();
w1.Start();
w1.Wait(); // This waits 110 seconds
var w2 = wait2();
w2.Start();
w2.Wait(); // This returns immediately
}
public static Task wait1()
{
return new Task(() =>
{
Console.WriteLine("Waiting...");
Thread.Sleep(10000);
Console.WriteLine("Done!");
});
}
public static Task wait2()
{
return new Task(async() =>
{
Console.WriteLine("Waiting...");
await Task.Delay(10000);
Console.WriteLine("Done!");
});
}
}
क्यों 'नया कार्य' बिल्कुल बनाते हैं? बाहरी विधि 'async' क्यों न बनाएं और इसे स्वचालित रूप से' कार्य 'वापस कर दें? यही है, 'स्थिर async कार्य प्रतीक्षा 3() {Console.WriteLine ("..."); कार्य का इंतजार। डेले (10000); Console.WriteLine ("..."); } ' –
@EricLippert मैंने कोशिश की; लेकिन ऐसा लगता है कि अलग-अलग व्यवहार किया जा रहा है ... कॉल करना '.Sartart))' सिस्टम 'फेंकता है। अविश्वसनीय अपवाद अपवाद: वादे-स्टाइल कार्य पर प्रारंभ नहीं किया जा सकता है। मेरे कार्य बाद में बुलाए जाने के लिए एक कतार में जा रहे हैं; इसलिए मुझे उन्हें बाद में शुरू करने में सक्षम होना चाहिए। –
क्या आपका लक्ष्य प्रतीक्षा समय तक इंतजार लाइन पर प्रतीक्षा 1/2 रोकना है? मैं इसे @fcuesta पर आपकी टिप्पणी के आधार पर पूछता हूं कि "मुझे बाद में कॉल करने में सक्षम होना चाहिए।" यदि ऐसा है, तो मुझे लगता है कि आपके द्वारा अपेक्षित निष्पादन के साथ प्रश्न को अद्यतन करने की आवश्यकता है। –