private void RunAsync()
{
string param = "Hi";
Task.Run(() => MethodWithParameter(param));
}
private void MethodWithParameter(string param)
{
}
সম্পাদনা করুন
জনপ্রিয় চাহিদার কারণে আমি অবশ্যই লক্ষ করব যে Task
লঞ্চটি কলিং থ্রেডের সাথে সমান্তরালে চলবে। ডিফল্ট ধরে নিলে এটি । TaskScheduler
নেট ব্যবহার করবে ThreadPool
। যাইহোক, এর অর্থ এই যে আপনি যে প্যারামিটারগুলিতে Task
একসাথে একাধিক থ্রেড দ্বারা একসাথে অ্যাক্সেস করা হয়েছে সেগুলি ভাগ করে নেওয়ার স্থিতিতে পরিণত হওয়া উচিত। এর মধ্যে তাদের কলিং থ্রেডে অ্যাক্সেস অন্তর্ভুক্ত রয়েছে।
আমার উপরের কোডে সেই কেসটি সম্পূর্ণরূপে বানানো হয়েছে। স্ট্রিংগুলি অপরিবর্তনীয়। এজন্য আমি তাদের উদাহরণ হিসাবে ব্যবহার করেছি। তবে বলুন আপনি একটি ব্যবহার করছেন না String
...
একটি সমাধান ব্যবহার async
এবং await
। এটি, ডিফল্টরূপে, SynchronizationContext
কলিং থ্রেডটি ক্যাপচার করবে এবং কল করার পরে বাকী পদ্ধতিটির জন্য একটি ধারাবাহিকতা তৈরি করবে এবং এটি তৈরির await
সাথে সংযুক্ত করবে Task
। এই পদ্ধতিটি যদি উইনফোর্ডস জিইউআই থ্রেডে চলছে তবে তা টাইপ হবে WindowsFormsSynchronizationContext
।
ধারাবাহিকতা ক্যাপচারে ফিরে পোস্ট করার পরে চলবে SynchronizationContext
- কেবলমাত্র ডিফল্টরূপে। সুতরাং আপনি await
কল করার পরে আপনি যে থ্রেডটি শুরু করেছিলেন তাতে ফিরে আসবেন । আপনি এটি বিভিন্ন উপায়ে উল্লেখযোগ্যভাবে ব্যবহার করে পরিবর্তন করতে পারেন ConfigureAwait
। সংক্ষেপে বলতে গেলে, যে পদ্ধতি বাকি পর্যন্ত করা হবে না পরেTask
অন্য থ্রেডে সম্পন্ন করেছে। তবে কলিং থ্রেডটি কেবল সামান্য পদ্ধতিতে নয়, সমান্তরালে চলতে থাকবে।
বাকি পদ্ধতিটি সম্পূর্ণরূপে অপেক্ষা করার অপেক্ষায় আকাঙ্খিত হতে পারে বা নাও পারে। যদি সেই পদ্ধতিতে কোনও কিছু পরে না পৌঁছানো প্যারামিটারগুলি অ্যাক্সেস করে তবে Task
আপনি মোটেও ব্যবহার করতে চাইবেন না await
।
অথবা আপনি পদ্ধতিতে অনেক পরে এই পরামিতিগুলি ব্যবহার করেন। await
অবিলম্বে কোনও কারণ নেই যেহেতু আপনি নিরাপদে কাজ চালিয়ে যেতে পারেন। মনে রাখবেন, আপনি Task
ফেরতটি একটি চলকতে এবং await
এটি পরে জমা রাখতে পারেন - এমনকি একই পদ্ধতিতেও। উদাহরণস্বরূপ, একবার আপনাকে অন্য কিছু কাজ করার পরে নিরাপদে পাস করা প্যারামিটারগুলি অ্যাক্সেস করতে হবে। আবার, আপনি কি না প্রয়োজন await
উপর Task
যখন আপনি এটি চালানো ঠিক আছে।
যাইহোক, পরামিতিগুলির সাথে সম্মত হয়ে এই থ্রেড-নিরাপদ করার সহজ উপায় Task.Run
হ'ল এটি করা:
আপনিই প্রথম সাজাইয়া রাখা আবশ্যক RunAsync
সঙ্গে async
:
private async void RunAsync()
গুরুত্বপূর্ণ তথ্য
সংযুক্ত ডকুমেন্টেশনের উল্লেখ অনুসারে চিহ্নিত পদ্ধতিটি বাতিল হওয়া উচিত নয় । এটির সাধারণ ব্যতিক্রম ইভেন্ট হ্যান্ডলারগুলি যেমন বাটন ক্লিক এবং এ জাতীয়। তারা অবশ্যই অকার্যকর ফিরে আসতে হবে। অন্যথায় আমি সর্বদা একটি বা ব্যবহার করার সময় ফেরত দেওয়ার চেষ্টা করি । এটি বেশ কয়েকটি কারণে ভাল অনুশীলন।async
Task
Task<TResult>
async
এখন আপনি নীচের মত await
চলতে পারেন Task
। আপনি await
ছাড়া ব্যবহার করতে পারবেন না async
।
await Task.Run(() => MethodWithParameter(param));
সুতরাং, সাধারণভাবে, যদি আপনি await
এই কাজটি করে থাকেন তবে আপনি এক সাথে একাধিক থ্রেড থেকে কোনও কিছুতে পরিবর্তন আনার সমস্ত ক্ষতিসাধনগুলি একটি সম্ভাব্য ভাগ করা সংস্থান হিসাবে পরামিতিগুলিতে পাস করা চিকিত্সা এড়াতে পারবেন। এছাড়াও, ক্লোজার থেকে সাবধান থাকুন । আমি তাদের গভীরতার সাথে আবরণ করব না তবে লিঙ্কযুক্ত নিবন্ধটি এটির দুর্দান্ত কাজ করে does
সাইড নোট
কিছুটা সামান্য বিষয়, তবে উইনফোর্ডস জিইউআই থ্রেডটি চিহ্নিত হওয়ার কারণে এটি যে কোনও ধরণের "ব্লকিং" ব্যবহার করে সাবধান হন [STAThread]
। ব্যবহার await
করা মোটেই অবরুদ্ধ হবে না, তবে আমি মাঝে মাঝে এটি কোনও ধরণের ব্লকিংয়ের সাথে ব্যবহার করে দেখি।
"ব্লক" উদ্ধৃতিতে রয়েছে কারণ আপনি প্রযুক্তিগতভাবে উইনফর্মস জিইউআই থ্রেডটি ব্লক করতে পারবেন না । হ্যাঁ, আপনি যদি lock
উইনফোর্ডস জিইউআই থ্রেড ব্যবহার করেন তবে এটি "অবরুদ্ধ" বলে ভেবেও বার্তা পাম্প করবে । এটা না।
এটি খুব বিরল ক্ষেত্রে উদ্ভট বিষয়গুলির কারণ হতে পারে। lock
উদাহরণস্বরূপ, পেইন্টিংয়ের সময় আপনি কখনই ব্যবহার করতে চান না তার একটি কারণ। তবে এটি একটি সীমাবদ্ধ এবং জটিল কেস; তবে আমি এটি পাগল সমস্যার কারণ দেখেছি। সুতরাং আমি সম্পূর্ণতার জন্য এটি নোট করেছি।