मुझे बस कुछ चीजों के साथ इस सवाल प्रस्तावना करते हैं:मिश्रण async/परिणाम के साथ इंतजार है
- मैं कई अतः कह रही है कि आप ऐसा नहीं करना चाहिए सवाल पढ़ा है यह (जैसे How to safely mix sync and async code के रूप में)
- मैं Async/Await - Best Practices in Asynchronous Programming पढ़ा है फिर से कह रही है कि आप ऐसा नहीं करना चाहिए इस
तो मुझे पता है कि यह एक सबसे अच्छा अभ्यास नहीं है, और किसी को भी मुझे इस तरह कह जरूरत नहीं है। यह एक "यह काम क्यों करता है" सवाल है।
मैं 2 बटन और एक स्थिति लेबल है कि एक छोटी सी जीयूआई आवेदन में लिखा है:
कि रास्ते से बाहर के साथ, यहाँ मेरे सवाल है। बटनों में से एक सिंक और एसिंक 100% समय के साथ डेडलॉक समस्या को पुन: पेश करेगा। दूसरा बटन एक ही एसिंक विधि को कॉल करता है लेकिन यह एक कार्य में लपेटा जाता है, यह एक काम करता है। मुझे पता है कि यह एक अच्छा कोडिंग अभ्यास नहीं है, लेकिन मैं को समझना चाहता हूं क्यों इसमें एक ही डेडलॉक समस्या नहीं है। यहाँ कोड है:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private async Task<string> DelayAsync()
{
await Task.Delay(1000);
return "Done";
}
private void buttonDeadlock_Click(object sender, EventArgs e)
{
labelStatus.Text = "Status: Running";
// causes a deadlock because of mixing sync and async code
var result = DelayAsync().Result;
// never gets here
labelStatus.Text = "Status: " + result;
}
private void buttonWorking_Click(object sender, EventArgs e)
{
labelStatus.Text = "Status: Running";
string result = null;
// still technically mixes sync and async, but works, why?
result = Task.Run(async() =>
{
return await DelayAsync();
}).Result;
labelStatus.Text = "Status: " + result;
}
}
वास्तव में मैं क्या चाहता था, आप तेजी से जवाब के लिए धन्यवाद देता हूं। – Middas