আপনি যদি আপনার পদ্ধতির ভিতরে অ্যাসিঙ্কটি ব্যবহার / প্রতীক্ষা করতে না চান তবে এখনও বাইরে থেকে অপেক্ষার কীওয়ার্ডটি ব্যবহার করতে সক্ষম হবেন, এটিকে "সাজাইয়া", TaskCompletionSource.cs :
public static Task<T> RunAsync<T>(Func<T> function)
{
if (function == null) throw new ArgumentNullException(“function”);
var tcs = new TaskCompletionSource<T>();
ThreadPool.QueueUserWorkItem(_ =>
{
try
{
T result = function();
tcs.SetResult(result);
}
catch(Exception exc) { tcs.SetException(exc); }
});
return tcs.Task;
}
এখান থেকে এবং এখানে
টাস্কগুলির সাথে এই জাতীয় দৃষ্টান্তকে সমর্থন করার জন্য, আমাদের একটি টাস্ক ফলদুটি ধরে রাখার একটি উপায় এবং স্বেচ্ছাচারী অ্যাসিঙ্ক্রোনাস অপারেশনটিকে একটি কার্য হিসাবে উল্লেখ করার দক্ষতা প্রয়োজন, তবে সেই কার্যটির অন্তর্নিহিত অবকাঠামোগত বিধি অনুসারে সেই কার্যকালের আজীবন নিয়ন্ত্রণ করতে হবে অ্যাসিক্রোনারি, এবং এমন কোনও উপায়ে গুরুত্বপূর্ণ যাতে ব্যয় হয় না। এটি TaskCompletionSource এর উদ্দেশ্য।
আমি দেখেছি। নেট উত্স যেমন। WebClient.cs :
[HostProtection(ExternalThreading = true)]
[ComVisible(false)]
public Task<string> UploadStringTaskAsync(Uri address, string method, string data)
{
// Create the task to be returned
var tcs = new TaskCompletionSource<string>(address);
// Setup the callback event handler
UploadStringCompletedEventHandler handler = null;
handler = (sender, e) => HandleCompletion(tcs, e, (args) => args.Result, handler, (webClient, completion) => webClient.UploadStringCompleted -= completion);
this.UploadStringCompleted += handler;
// Start the async operation.
try { this.UploadStringAsync(address, method, data, tcs); }
catch
{
this.UploadStringCompleted -= handler;
throw;
}
// Return the task that represents the async operation
return tcs.Task;
}
অবশেষে, আমি নিম্নলিখিতগুলিও দরকারী পেয়েছি:
আমি এই প্রশ্নটি সারাক্ষণ জিজ্ঞাসা করি। এর অর্থ এই যে কোনও কোনও থ্রেড থাকা আবশ্যক যা বাহ্যিক সংস্থানগুলিতে আই / ও কলটিতে অবরুদ্ধ রয়েছে। সুতরাং, অ্যাসিঙ্ক্রোনাস কোড অনুরোধের থ্রেডকে মুক্ত করে, তবে কেবল সিস্টেমের অন্য থ্রেডের ব্যয়েই, ঠিক? না কোনভাবেই না. কেন অ্যাসিঙ্ক্রোনাস অনুরোধগুলি স্কেল হয় তা বোঝার জন্য, আমি অ্যাসিঙ্ক্রোনাস আই / ও কলটির একটি (সরলিকৃত) উদাহরণটি সন্ধান করব। ধরা যাক একটি অনুরোধের জন্য কোনও ফাইল লিখতে হবে। অনুরোধ থ্রেড অ্যাসিক্রোনাস রাইটিং পদ্ধতি কল করে। WritAsync বেস ক্লাস লাইব্রেরি (বিসিএল) দ্বারা প্রয়োগ করা হয়েছে এবং এর অ্যাসিনক্রোনাস I / O এর জন্য সমাপ্তি বন্দর ব্যবহার করে। সুতরাং, WritAsync কলটি অ্যাসিঙ্ক্রোনাস ফাইল রাইটিং হিসাবে ওএস-এ চলে গেছে। ওএস ড্রাইভার স্ট্যাকের সাথে যোগাযোগ করে, আই / ও অনুরোধ প্যাকেটে (আইআরপি) লেখার জন্য ডেটা বরাবর চলে যায়। এখানেই জিনিসগুলি আকর্ষণীয় হয়ে উঠেছে: যদি কোনও ডিভাইস ড্রাইভার তাত্ক্ষণিকভাবে কোনও আইআরপি হ্যান্ডেল করতে না পারে তবে এটি অবশ্যই এটি অবিচ্ছিন্নভাবে পরিচালনা করতে হবে। সুতরাং, ড্রাইভার ডিস্কটি লেখা শুরু করতে বলে এবং ওএসের কাছে একটি "মুলতুবি" প্রতিক্রিয়া দেয়। ওএস ছাত্রলীগের সেই "মুলতুবি" প্রতিক্রিয়াটি পাস করে এবং ছাত্রলীগ অনুরোধ হ্যান্ডলিং কোডটিতে একটি অসম্পূর্ণ কাজটি ফিরিয়ে দেয়। অনুরোধ-হ্যান্ডলিং কোডটি সেই কার্যটির জন্য অপেক্ষা করছে, যা সেই পদ্ধতি থেকে অন্য একটি অসম্পূর্ণ কাজটি প্রদান করে। অবশেষে, অনুরোধ-হ্যান্ডলিং কোডটি এএসপি.এনইটি-র কাছে অসম্পূর্ণ কাজটি শেষ করে এবং অনুরোধের থ্রেডটি থ্রেড পুলে ফিরে যাওয়ার জন্য মুক্ত হয়। অনুরোধ-হ্যান্ডলিং কোডটি সেই কার্যটির জন্য অপেক্ষা করছে, যা সেই পদ্ধতি থেকে অন্য একটি অসম্পূর্ণ কাজটি প্রদান করে। অবশেষে, অনুরোধ-হ্যান্ডলিং কোডটি এএসপি.এনইটি-র কাছে অসম্পূর্ণ কাজটি শেষ করে এবং অনুরোধের থ্রেডটি থ্রেড পুলে ফিরে যাওয়ার জন্য মুক্ত হয়। অনুরোধ-হ্যান্ডলিং কোডটি সেই কার্যটির জন্য অপেক্ষা করছে, যা সেই পদ্ধতি থেকে অন্য একটি অসম্পূর্ণ কাজটি প্রদান করে। অবশেষে, অনুরোধ-হ্যান্ডলিং কোডটি এএসপি.এনইটি-র কাছে অসম্পূর্ণ কাজটি শেষ করে এবং অনুরোধের থ্রেডটি থ্রেড পুলে ফিরে যাওয়ার জন্য মুক্ত হয়।
এএসপি.এনইটি তে অ্যাসিঙ্ক / ওয়েভের পরিচয়
যদি লক্ষ্যটি স্কেলেবিলিটি (প্রতিক্রিয়াশীলতার চেয়ে) উন্নত করা হয় তবে এটি সমস্তই বাহ্যিক আই / ও এর অস্তিত্বের উপর নির্ভর করে যা এটি করার সুযোগ দেয়।