আপনার প্রশ্ন অনুযায়ী ...
C # তে থ্রেড.ড্রেডস্টার্ট () পদ্ধতিতে কীভাবে প্যারামিটারগুলি পাস করবেন?
... এবং আপনি যে ত্রুটির মুখোমুখি হয়েছিলেন সেখান থেকে আপনাকে আপনার কোডটি সংশোধন করতে হবে
Thread thread = new Thread(new ThreadStart(download(filename));
প্রতি
Thread thread = new Thread(new ThreadStart(download));
thread.Start(filename);
তবে প্রশ্নটি প্রথমে যেমনটি মনে হচ্ছে আরও জটিল।
Threadবর্গ বর্তমানে (4.7.2) বিভিন্ন উপলব্ধ কনস্ট্রাকটর এবং Startoverloads সঙ্গে পদ্ধতি।
এই প্রশ্নের জন্য এই প্রাসঙ্গিক নির্মাতারা হলেন:
public Thread(ThreadStart start);
এবং
public Thread(ParameterizedThreadStart start);
যা হয় একটি ThreadStartপ্রতিনিধি বা একটি ParameterizedThreadStartপ্রতিনিধি গ্রহণ।
সংশ্লিষ্ট প্রতিনিধিরা এর মতো দেখায়:
public delegate void ThreadStart();
public delegate void ParameterizedThreadStart(object obj);
যেমন দেখা যায়, সঠিকভাবে নির্মাণকারীর ব্যবহারকারীর ParameterizedThreadStartপ্রতিনিধি নিচ্ছেন বলে মনে হচ্ছে যাতে কোনও পদ্ধতি ডেলিগেটের নির্দিষ্ট স্বাক্ষর অনুসারে থ্রেডের সাহায্যে শুরু করা যায়।
Threadক্লাসটি ইনস্ট্যান্ট করার জন্য একটি সাধারণ উদাহরণ হবে
Thread thread = new Thread(new ParameterizedThreadStart(Work));
বা শুধু
Thread thread = new Thread(Work);
সংশ্লিষ্ট পদ্ধতির স্বাক্ষর ( Workএই উদাহরণে বলা হয়) এর মতো দেখায়:
private void Work(object data)
{
...
}
যা বাকি তা থ্রেড শুরু করা। এটি হয় ব্যবহার করে করা হয়
public void Start();
অথবা
public void Start(object parameter);
যদিও Start()থ্রেড শুরু করা এবং পাস হবে nullপদ্ধতিতে ডেটা, Start(...)পাস ব্যবহার করা যেতে পারে কিছু মধ্যে Workথ্রেডের পদ্ধতি।
এই পদ্ধতির সাথে তবে একটি বড় সমস্যা রয়েছে: Workপদ্ধতিতে পাস করা সমস্ত কিছু একটি বস্তুতে ফেলে দেওয়া হয়। তার মানে হল যে Workপদ্ধতিটির মধ্যে এটি নীচের উদাহরণের মতো আবারও মূল ধরণে ফেলে দিতে হবে:
public static void Main(string[] args)
{
Thread thread = new Thread(Work);
thread.Start("I've got some text");
Console.ReadLine();
}
private static void Work(object data)
{
string message = (string)data; // Wow, this is ugly
Console.WriteLine($"I, the thread write: {message}");
}
কাস্টিং এমন একটি জিনিস যা আপনি সাধারণত করতে চান না।
যদি কেউ অন্য কিছু পাস করে যা স্ট্রিং নয়? যেহেতু এটি প্রথমে সম্ভব নয় বলে মনে হয় (কারণ এটি আমার পদ্ধতি, আমি জানি আমি কী করি বা পদ্ধতিটি ব্যক্তিগত, তাই কোনও ব্যক্তির কীভাবে কোনও কিছুতে এটি পাস করা কখনই সক্ষম হওয়া উচিত? ) বিভিন্ন কারণে আপনি সম্ভবত ঠিক সেই ক্ষেত্রেই শেষ করতে পারেন । কিছু ক্ষেত্রে সমস্যা নাও হতে পারে, অন্যরা হ'ল are এই ক্ষেত্রে আপনি সম্ভবত একটি সঙ্গে শেষ হবেInvalidCastException এমনটি যা আপনি সম্ভবত লক্ষ্য করবেন না কারণ এটি কেবল থ্রেডটি বন্ধ করে দেয়।
একটি সমাধান হিসেবে আপনি একটি জেনেরিক পেতে আশা ParameterizedThreadStartমত প্রতিনিধি ParameterizedThreadStart<T>যেখানে Tআপনি মধ্যে পাস করতে চান ডেটার প্রকারের হবে Workপদ্ধতি। দুর্ভাগ্যক্রমে এর মতো কিছু বিদ্যমান নেই (এখনও?)।
তবে এই ইস্যুটির একটি প্রস্তাবিত সমাধান রয়েছে । এটিতে একটি শ্রেণি তৈরি করা রয়েছে যা উভয়ই রয়েছে, ডেটা থ্রেডে পাঠানো হবে পাশাপাশি সেই পদ্ধতি যা শ্রমিকের পদ্ধতিটিকে এভাবে প্রতিনিধিত্ব করে:
public class ThreadWithState
{
private string message;
public ThreadWithState(string message)
{
this.message = message;
}
public void Work()
{
Console.WriteLine($"I, the thread write: {this.message}");
}
}
এই পদ্ধতির সাহায্যে আপনি থ্রেডটি এভাবে শুরু করবেন:
ThreadWithState tws = new ThreadWithState("I've got some text");
Thread thread = new Thread(tws.Work);
thread.Start();
সুতরাং এই উপায়ে আপনি কেবল চারপাশে ingালাই এড়ানো এবং কোনও থ্রেডে ডেটা সরবরাহ করার একটি টাইপসেজ উপায় আছে ;-)