मैंने एरिक लिपर्ट के article को लगभग async
पढ़ा है, और भ्रम के बारे में लोगों के पास async
कीवर्ड था। उन्होंने कहा:async - वर्तमान धागे पर रहें?
यह (
async
) का अर्थ है "इस विधि नियंत्रण प्रवाह शामिल है कि अतुल्यकालिक संचालन का इंतजार कर रहा है और इसलिए शैली गुजर सुनिश्चित करना है कि अतुल्यकालिक संचालन इस विधि को फिर से शुरू कर सकते हैं निरंतरता में संकलक द्वारा फिर से लिखा हो जाएंगे सही जगह पर। "async तरीकों इसके बारे में पूरी बात यह है कि आप के रूप में ज्यादा संभव
मुझे यह समझ में नहीं आता के रूप में वर्तमान धागे पर रहते हैं। यदि मैं एक एसिंक्रोनस विधि (Task
) निष्पादित करता हूं और यह चलता है, तो यह निश्चित रूप से किसी अन्य थ्रेड पर चलता है।
इसके अलावा, अगर मैं लिखना एक विधि await
, (imho) का उपयोग करता है यह सामान्य नियंत्रण प्रवाह जारी करता है, और कोड पुनर्संशोधित एक जैसे "ContinueWith
" बाद में, एक और धागे पर है।
मैं (कंसोल) के साथ यह परीक्षण किया:
/*1*/ public void StartChain()
/*2*/ {
/*3*/ var a = FuncA();
/*4*/ Console.WriteLine(a.Result);
/*5*/ }
/*6*/
/*7*/ public async Task <int> FuncA()
/*8*/ {
/*9*/ Console.WriteLine("A--" + Thread.CurrentThread.ManagedThreadId);
/*10*/ var t = await FuncB();
/*11*/ Console.WriteLine("B--" + Thread.CurrentThread.ManagedThreadId);
/*12*/ return t;
/*13*/ }
/*14*/
/*15*/ public async Task <int> FuncB()
/*16*/ {
/*17*/ Console.WriteLine("C--" + Thread.CurrentThread.ManagedThreadId);
/*18*/ await Task.Delay(2000);
/*19*/ Console.WriteLine("D--" + Thread.CurrentThread.ManagedThreadId);
/*20*/ return 999;
/*21*/ }
/*22*/
/*23*/ void Main()
/*24*/ {
/*25*/ StartChain();
/*26*/ }
/*27*/
परिणाम है:
A--7
C--7
D--17 <-----D and B are on different thread
B--17
999
तो क्या एरिक कहा, "वर्तमान धागा पर रहने" द्वारा मतलब था?
संपादित करें 1:
asp.net
में यह भी लौट differnt धागा आईडी।
public async Task<int> FuncA()
{
Response.Write("<br/>C----" + Thread.CurrentThread.ManagedThreadId);
var t = await FuncB();
Response.Write("<br/>D----" + Thread.CurrentThread.ManagedThreadId);
return t;
}
public async Task<int> FuncB()
{
Response.Write("<br/>E----" + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(2000);
Response.Write("<br/>F----" + Thread.CurrentThread.ManagedThreadId);
return 999;
}
protected async void Page_Load(object sender, EventArgs e)
{
Response.Write("<br/>A----" + Thread.CurrentThread.ManagedThreadId);
var a=await FuncA();
Response.Write("<br/>B----" + Thread.CurrentThread.ManagedThreadId);
}
A----8
C----8
E----8
F----9
D----9
B----9
संपादित यह है कि धागा लगता है 2
(एक जवाब मिलने के बाद ही)
केवल जीयूआई क्षुधा में परोसा जाता है। मैं WinForm पर
public async Task<int> FuncA()
{
textBox1.Text +=Environment.NewLine+ "\nC----" + Thread.CurrentThread.ManagedThreadId;
var t = await FuncB();
textBox1.Text += Environment.NewLine + "\nD----" + Thread.CurrentThread.ManagedThreadId;
return t;
}
public async Task<int> FuncB()
{
textBox1.Text += Environment.NewLine + "\nE----" + Thread.CurrentThread.ManagedThreadId;
await Task.Delay(2000);
textBox1.Text += Environment.NewLine + "\nF----" + Thread.CurrentThread.ManagedThreadId;
return 999;
}
private async void Form1_Load(object sender, EventArgs e)
{
textBox1.Text += Environment.NewLine + "\nA----" + Thread.CurrentThread.ManagedThreadId;
var a = await FuncA();
textBox1.Text += Environment.NewLine + "\nB----" + Thread.CurrentThread.ManagedThreadId;
}
इस लेख से लिंक करें जिसे आप –
@downvoter के बारे में उलझन में हैं - टिप्पणी उपयोगी होगी। –
जिस कार्य का आप इंतजार कर रहे हैं वह दूसरे धागे पर चलता है। Async विधि में अन्य सभी कोड मूल धागे पर चलता है। इंतजार एक नया काम शुरू नहीं करता है। यह मूल धागे में जारी है एक समतुल्य है। ऐसे कई ब्लॉग हैं जो इस पर चर्चा करते हैं। –