সবে VS2012 পেয়েছে এবং একটি হ্যান্ডেল চালু করার চেষ্টা করছে async
।
ধরা যাক আমি একটি পদ্ধতি পেয়েছি যা একটি ব্লকিং উত্স থেকে কিছু মান নিয়ে আসে। আমি চাই না পদ্ধতিটির কলারটি ব্লক করা হোক। আমি কলব্যাক নেওয়ার জন্য পদ্ধতিটি লিখতে পারি যা মানটি আসার সাথে সাথে অনুরোধ করা হয়, তবে যেহেতু আমি সি # 5 ব্যবহার করছি, তাই আমি পদ্ধতিটি অ্যাসিঙ্ক করার সিদ্ধান্ত নিয়েছি যাতে কলারদের কলব্যাকগুলি মোকাবেলা করতে না হয়:
// contrived example (edited in response to Servy's comment)
public static Task<string> PromptForStringAsync(string prompt)
{
return Task.Factory.StartNew(() => {
Console.Write(prompt);
return Console.ReadLine();
});
}
এখানে এটির একটি উদাহরণ পদ্ধতি রয়েছে। যদি PromptForStringAsync
অ্যাসিঙ্ক না হয় তবে এই পদ্ধতির জন্য কলব্যাকের মধ্যে কলব্যাকের নীড়ের প্রয়োজন require অ্যাসিঙ্কের সাথে আমি আমার পদ্ধতিটি খুব প্রাকৃতিক উপায়ে লিখতে চাই:
public static async Task GetNameAsync()
{
string firstname = await PromptForStringAsync("Enter your first name: ");
Console.WriteLine("Welcome {0}.", firstname);
string lastname = await PromptForStringAsync("Enter your last name: ");
Console.WriteLine("Name saved as '{0} {1}'.", firstname, lastname);
}
এ পর্যন্ত সব ঠিকই. আমি যখন getNameAsync কল করি তখন সমস্যাটি হয় :
public static void DoStuff()
{
GetNameAsync();
MainWorkOfApplicationIDontWantBlocked();
}
পুরো বিষয়টি GetNameAsync
হ'ল এটি অ্যাসিনক্রোনাস। আমি এটিকে ব্লক করতে চাই না , কারণ আমি মেইনওয়ার্কঅফ অ্যাপ্লিকেশন আইডোনটওয়ান্ট ব্লক করা ASAP এ ফিরে যেতে চাই এবং getNameAsyncটিকে ব্যাকগ্রাউন্ডে এটি করতে দিন। যাইহোক, এটিকে এভাবে কল করা আমাকে GetNameAsync
লাইনে একটি সংকলক সতর্কতা দেয় :
Warning 1 Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call.
আমি পুরোপুরি সচেতন যে "কলটি শেষ হওয়ার আগেই" বর্তমান পদ্ধতির কার্যকরকরণ অব্যাহত রয়েছে "। এটি অ্যাসিক্রোনাস কোডের পয়েন্ট , তাই না?
আমি আমার কোডটি সতর্কতা ছাড়াই সংকলন করতে পছন্দ করি, তবে এখানে "ফিক্স" করার কিছুই নেই কারণ কোডটি আমি যা করতে চাইছি ঠিক তাই করছে। এর রিটার্ন মান সংরক্ষণ করে আমি সতর্কতা থেকে মুক্তি পেতে পারি GetNameAsync
:
public static void DoStuff()
{
var result = GetNameAsync(); // supress warning
MainWorkOfApplicationIDontWantBlocked();
}
তবে এখন আমার অতিরিক্ত ব্যবহার্য কোড রয়েছে। ভিজ্যুয়াল স্টুডিওতে বোঝা যাচ্ছে যে আমি এই অপ্রয়োজনীয় কোডটি লিখতে বাধ্য হয়েছিল, কারণ এটি স্বাভাবিক "কখনই ব্যবহৃত হয় না" সতর্কতা দমন করে।
অ্যাসিঙ্ক নয় এমন কোনও পদ্ধতিতে GetNameAsync মোড়ানো দ্বারাও আমি সতর্কতা থেকে মুক্তি পেতে পারি:
public static Task GetNameWrapper()
{
return GetNameAsync();
}
তবে এটি আরও বেশি অতিরিক্ত অতিরিক্ত কোড। সুতরাং আমাকে কোড লিখতে হবে আমার একটি অপ্রয়োজনীয় সতর্কতা দরকার বা সহ্য করতে হবে না।
আমার অসম্পূর্ণ ব্যবহার সম্পর্কে এখানে কি ভুল আছে?
GetNameAsync
পুরো নাম ঐ ব্যবহারকারীর সরবরাহ করা হয়েছিল (অর্থাত প্রদান Task<Name>
, বরং শুধু একটি ফেরার চেয়ে Task
? DoStuff
এবং হয় তারপর যে কাজটি সংরক্ষণ করতে পারে, await
এটা পরে অন্যান্য পদ্ধতি, অথবা এমনকি কাজের যে অন্যান্য পাস পদ্ধতি, যাতে এটি করতে পারে await
বা Wait
এটা কোথাও এটা বাস্তবায়ন ভেতরে।
async
কীওয়ার্ডটি সরান ।
PromptForStringAsync
করার সময় আপনার প্রয়োজনের চেয়ে বেশি কাজ করুন; শুধু ফলাফল ফিরেTask.Factory.StartNew
। এটি ইতিমধ্যে একটি কাজ যাঁর মান কনসোলে প্রবেশ করা স্ট্রিং। ফলাফলটির প্রত্যাবর্তনের অপেক্ষা করার দরকার নেই; এটি করার ফলে কোনও নতুন মান যুক্ত হয় না।