প্রথমে কিছু পরিভাষা পরিষ্কার করা যাক: "অ্যাসিনক্রোনাস" ( async
) এর অর্থ এটি কলিং থ্রেড শুরু হওয়ার আগেই ফিরে আসতে পারে yield একটি async
পদ্ধতিতে, সেই "ফলন" পয়েন্টগুলি await
হ'ল প্রকাশ।
এটি "অ্যাসিঙ্ক্রোনাস" শব্দটির থেকে খুব আলাদা, কারণ এমএসডিএন ডকুমেন্টেশন দ্বারা "ব্যাকগ্রাউন্ড থ্রেডে এক্সিকিউটস" বোঝাতে বছরের পর বছর ধরে ব্যবহৃত হয়েছে (ভুল) mis
ইস্যুটিকে আরও বিভ্রান্ত করার async
জন্য "প্রতীক্ষিত" এর চেয়ে আলাদা; কিছু async
পদ্ধতি রয়েছে যার প্রত্যাবর্তনের ধরণগুলি প্রত্যাশিত নয় এবং অনেক পদ্ধতি প্রত্যাশিত ধরণের প্রত্যাবর্তনকারী নয় async
।
যা তারা নয় তা যথেষ্ট ; এখানে তারা কি হয় :
async
শব্দ একটি অ্যাসিঙ্ক্রোনাস পদ্ধতি পারবেন (যে, এটা করতে পারবেন await
এক্সপ্রেশন)। async
পদ্ধতি ফেরত দিতে পারেন Task
, Task<T>
অথবা (যদি আপনি আবশ্যক) void
।
- কোনও নির্দিষ্ট ধরণ অনুসরণ করে এমন কোনও ধরণের অপেক্ষারত হতে পারে। সবচেয়ে সাধারণ awaitable ধরনের হয়
Task
এবং Task<T>
।
সুতরাং, আমরা যদি আপনার প্রশ্নের "কীভাবে ব্যাকগ্রাউন্ড থ্রেডের জন্য অপেক্ষাকৃতভাবে অপারেশন চালাতে পারি" তে এটি সংশোধন করি তবে উত্তরটি ব্যবহার করতে হবে Task.Run
:
private Task<int> DoWorkAsync() // No async because the method does not need await
{
return Task.Run(() =>
{
return 1 + 2;
});
}
(তবে এই নিদর্শনটি একটি দুর্বল পদ্ধতির; নীচে দেখুন)।
তবে যদি আপনার প্রশ্নটি হয় "আমি কীভাবে এমন একটি async
পদ্ধতি তৈরি করব যা ব্লকিংয়ের পরিবর্তে তার কলারের কাছে ফিরে আসতে পারে", উত্তরটি হল পদ্ধতিটি ঘোষণা করা async
এবং await
তার "ফলনশীল" পয়েন্টগুলির জন্য ব্যবহার করা:
private async Task<int> GetWebPageHtmlSizeAsync()
{
var client = new HttpClient();
var html = await client.GetAsync("http://www.example.com/");
return html.Length;
}
সুতরাং, জিনিসগুলির প্রাথমিক প্যাটার্ন হ'ল async
কোডটি তার await
এক্সপ্রেশনগুলিতে "প্রতীক্ষিত "গুলির উপর নির্ভর করে । এই "প্রতীক্ষিত "গুলি অন্যান্য async
পদ্ধতি বা কেবল নিয়মিত পদ্ধতিগুলির জন্য প্রত্যাবর্তনযোগ্য হতে পারে। ফিরে নিয়মিত পদ্ধতি Task
/ Task<T>
করতে ব্যবহার Task.Run
একটি ব্যাকগ্রাউন্ড থ্রেডে কোড এক্সিকিউট করা অথবা (আরো সাধারণভাবে) তারা ব্যবহার করতে পারেন TaskCompletionSource<T>
বা তার শর্টকাট (এক TaskFactory.FromAsync
, Task.FromResult
ইত্যাদি)। আমি না একটি সমগ্র পদ্ধতি মোড়কে সুপারিশ Task.Run
; সিঙ্ক্রোনাস পদ্ধতিতে সিঙ্ক্রোনাস স্বাক্ষর থাকতে হবে এবং এটি একটিতে আবৃত করা উচিত কিনা তা গ্রাহকের উপর ছেড়ে দেওয়া উচিত Task.Run
:
private int DoWork()
{
return 1 + 2;
}
private void MoreSynchronousProcessing()
{
// Execute it directly (synchronously), since we are also a synchronous method.
var result = DoWork();
...
}
private async Task DoVariousThingsFromTheUIThreadAsync()
{
// I have a bunch of async work to do, and I am executed on the UI thread.
var result = await Task.Run(() => DoWork());
...
}
আমি একজন আছে async
/ await
ইন্ট্রো আমার ব্লগে; শেষে কিছু ভাল ফলোআপ সংস্থান আছে। এর জন্য এমএসডিএন ডক্সও async
অস্বাভাবিকভাবে ভাল।