আমার এএসপি.এনইটি অ্যাপ্লিকেশনটিতে একটি পদ্ধতি রয়েছে যা সম্পূর্ণ করতে যথেষ্ট সময় ব্যয় করে। ক্যাশে অবস্থা এবং ব্যবহারকারী যে প্যারামিটারগুলি সরবরাহ করে তার উপর নির্ভর করে এই ব্যবহারকারীর অনুরোধের সময় এই পদ্ধতিতে একটি কল 3 বার আসতে পারে। প্রতিটি কল সম্পূর্ণ হতে প্রায় 1-2 সেকেন্ড সময় নেয়। পদ্ধতিটি নিজেই পরিষেবাতে সিঙ্ক্রোনাস কল এবং বাস্তবায়নটিকে ওভাররাইড করার কোনও সম্ভাবনা নেই।
সুতরাং পরিষেবাটিতে সিঙ্ক্রোনাস কলটি দেখতে নিম্নলিখিতটির মতো দেখাচ্ছে:
public OutputModel Calculate(InputModel input)
{
// do some stuff
return Service.LongRunningCall(input);
}
এবং পদ্ধতির ব্যবহার হ'ল (দ্রষ্টব্য, সেই পদ্ধতির কলটি একাধিকবার ঘটতে পারে):
private void MakeRequest()
{
// a lot of other stuff: preparing requests, sending/processing other requests, etc.
var myOutput = Calculate(myInput);
// stuff again
}
এই পদ্ধতির একযোগে কাজ সরবরাহ করার জন্য আমি আমার পক্ষ থেকে বাস্তবায়নটি পরিবর্তন করার চেষ্টা করেছি এবং আমি এ পর্যন্ত এলাম।
public async Task<OutputModel> CalculateAsync(InputModel input)
{
return await Task.Run(() =>
{
return Calculate(input);
});
}
ব্যবহার ("অন্য জিনিসগুলি করুন" কোডের অংশটি পরিষেবাতে কল করার সাথে সাথে চলমান):
private async Task MakeRequest()
{
// do some stuff
var task = CalculateAsync(myInput);
// do other stuff
var myOutput = await task;
// some more stuff
}
আমার প্রশ্নটি নিম্নলিখিত is আমি কি এএসপি.এনইটি অ্যাপ্লিকেশনটিতে কার্যকরকরণের গতি বাড়ানোর জন্য সঠিক পন্থাটি ব্যবহার করছি বা আমি সিঙ্ক্রোনাস কোডটি সংযোজিতভাবে চালানোর চেষ্টা করছি? দ্বিতীয় পদ্ধতিটি কেন এএসপি.নেটে বিকল্প নয় (যদি এটি সত্যই না হয়) তবে কী কেউ ব্যাখ্যা করতে পারেন? এছাড়াও, যদি এই ধরণের পদ্ধতির প্রয়োগ হয়, তবে কি এই মুহুর্তে আমাদের সম্পাদিত হতে পারে এমন একমাত্র কল যদি আমার এই পদ্ধতিটিকে অবিচ্ছিন্নভাবে কল করার দরকার হয় (আমার ক্ষেত্রে এমন ঘটনা ঘটে থাকে, যখন সমাপ্তির জন্য অপেক্ষা করার সময় অন্য কোনও জিনিস করার দরকার নেই)?
এই বিষয়ের নেটে বেশিরভাগ নিবন্ধগুলি async-await
কোডটির সাথে অ্যাপ্রোচ ব্যবহার করে কভার করে , যা ইতিমধ্যে awaitable
পদ্ধতি সরবরাহ করে, তবে এটি আমার ক্ষেত্রে নয়। এখানেএটি আমার ক্ষেত্রে বর্ণনা করার একটি সুন্দর নিবন্ধ, যা সমান্তরাল কলগুলির পরিস্থিতি বর্ণনা করে না, সিঙ্ক কলটি মোড়ানোর বিকল্পটি অস্বীকার করে, তবে আমার মতে আমার পরিস্থিতি হ'ল এটি করার উপলক্ষ।
সাহায্য এবং টিপস জন্য অগ্রিম ধন্যবাদ।
Task.Run
বিষয়বস্তুটি অন্য থ্রেডে চালিত হয় যা থ্রেড পুল থেকে নেওয়া হয়। তারপরে ব্লকিং কলগুলিকে (যেমন মাই কল থেকে সার্ভিসে) মোড়কের কোনও প্রয়োজন নেইRun
, কারণ তারা সর্বদা প্রতিটি থ্রেড গ্রহণ করবে, যা পদ্ধতিটি কার্যকর করার সময় অবরুদ্ধ করা হবে। এই পরিস্থিতিতেasync-await
আমার ক্ষেত্রে কেবলমাত্র উপকারটিই বাকি রয়েছে তা একবারে বেশ কয়েকটি ক্রিয়া সম্পাদন করে। দয়া করে, আমি ভুল হলে আমাকে সংশোধন করুন।