নতুন থ্রেডে আমি কীভাবে একটি সাধারণ বিট কোড চালাব?


340

আমার কিছুটা কোড রয়েছে যা জিইউআইয়ের তুলনায় আমার আলাদা থ্রেডে চালানো দরকার কারণ এটি বর্তমানে কোডটি চালিত হওয়ার সাথে সাথে ফর্মটি স্থির করে দেয় (10 সেকেন্ড বা তার বেশি)।

ধরুন আমি এর আগে কখনও নতুন থ্রেড তৈরি করিনি; সি # তে এটি কীভাবে করা যায় এবং নেট ফ্রেমওয়ার্ক 2.0 বা তার পরে কীভাবে ব্যবহার করা যায় তার একটি সাধারণ / মৌলিক উদাহরণ কী?


2
এখানে বেশিরভাগ উত্তরগুলি তখন ভাল ছিল তবে NET ফ্রেমওয়ার্ক 4.0 এর উন্নতিগুলি বিষয়গুলিকে আরও সহজ করে তোলে। : এই উত্তর বর্ণনা অনুযায়ী আপনি Task.Run () মেথড ব্যবহার করতে পারেন stackoverflow.com/a/31778592/1633949
রিচার্ড দ্বিতীয়

উত্তর:


336

ভাল জায়গা পড়া শুরু করার জো Albahari

আপনি যদি নিজের থ্রেডটি তৈরি করতে চান তবে এটি যতটা সহজ তা পাওয়া যায়:

using System.Threading;
new Thread(() => 
{
    Thread.CurrentThread.IsBackground = true; 
    /* run your code here */ 
    Console.WriteLine("Hello, world"); 
}).Start();

@ এডপাওয়ার, এটি কি উইনফর্মগুলির জন্যই প্রযোজ্য .. বা এটি ওয়েব ফর্মগুলিতে কাজ করবে ..?
মেথডম্যান

@ মেঠোডম্যান - হ্যাঁ, এটি ওয়েব ফর্মগুলিতে কাজ করবে। এখানে শুরু করুন:
এড পাওয়ার

9
IsBackgroundসত্যে স্থাপনের বিষয়ে সাবধানতা অবলম্বন করুন । এটি সম্ভবত আপনি যা ভাবেন তা করেন না। এটি কী করে, সমস্ত পূর্বগ্রাউন্ড থ্রেড মারা গেলে থ্রেডটি মারা যাবে কিনা, বা থ্রেডটি অ্যাপ্লিকেশনটি বাঁচিয়ে রাখবে কিনা তা কনফিগার করে। আপনি যদি চান না যে আপনার থ্রেডটি মিড-এক্সিকিউশনটি সমাপ্ত IsBackgroundহয়, সত্য হিসাবে সেট করবেন না ।
জিরো 3

10
@ অ্যাডপাওয়ার আমার মনে হয় আপনার যেভাবেই সাবধান হওয়া উচিত! আপনি সম্ভবত মধ্য-প্রয়োগ কার্যকর করতে চান না এমন কোনও কাজের একটি উদাহরণ যা ডিস্কে ডেটা সংরক্ষণ করে। তবে নিশ্চিত, যদি আপনার কাজটি যে কোনও সময় সমাপ্তির জন্য উপযুক্ত হয় তবে পতাকাটি ভাল। আমার বক্তব্যটি কেবলমাত্র এটি ছিল যে পতাকাটি ব্যবহার সম্পর্কে সতর্ক হওয়া দরকার , যেহেতু আপনি এর উদ্দেশ্যটি বর্ণনা করেন নি, এবং এর নামকরণটি সহজেই বিশ্বাস করতে পারে যে এটি আসলে যা করে তা ছাড়া এটি অন্য কিছু করে।
জিরো 3

3
: .NET ফ্রেমওয়ার্ক 4.0+ শুধু Task.Run (), এই উত্তর বর্ণিত হিসাবে ব্যবহার stackoverflow.com/a/31778592/1633949
রিচার্ড দ্বিতীয়

193

BackgroundWorker আপনার জন্য সেরা পছন্দ বলে মনে হচ্ছে।

এখানে আমার ন্যূনতম উদাহরণ। আপনি বাটনে ক্লিক করার পরে পটভূমি কর্মী ব্যাকগ্রাউন্ড থ্রেডে কাজ শুরু করবে এবং একই সাথে এর অগ্রগতির প্রতিবেদন করবে। কাজ শেষ হওয়ার পরে এটিও প্রতিবেদন করবে।

using System.ComponentModel;
...
    private void button1_Click(object sender, EventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();

        // this allows our worker to report progress during work
        bw.WorkerReportsProgress = true;

        // what to do in the background thread
        bw.DoWork += new DoWorkEventHandler(
        delegate(object o, DoWorkEventArgs args)
        {
            BackgroundWorker b = o as BackgroundWorker;

            // do some simple processing for 10 seconds
            for (int i = 1; i <= 10; i++)
            {
                // report the progress in percent
                b.ReportProgress(i * 10);
                Thread.Sleep(1000);
            }

        });

        // what to do when progress changed (update the progress bar for example)
        bw.ProgressChanged += new ProgressChangedEventHandler(
        delegate(object o, ProgressChangedEventArgs args)
        {
            label1.Text = string.Format("{0}% Completed", args.ProgressPercentage);
        });

        // what to do when worker completes its task (notify the user)
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
        delegate(object o, RunWorkerCompletedEventArgs args)
        {
            label1.Text = "Finished!";
        });

        bw.RunWorkerAsync();
    }

বিঃদ্রঃ:

  • সরলতার জন্য সি # র বেনাম পদ্ধতিটি ব্যবহার করে আমি সবকিছুকে একক পদ্ধতিতে রেখেছি তবে আপনি এগুলি সর্বদা বিভিন্ন পদ্ধতিতে টানতে পারেন।
  • জিইউআই ProgressChangedবা RunWorkerCompletedহ্যান্ডলারের মধ্যে আপডেট করা নিরাপদ । তবে, জিইউআই থেকে আপডেট করার DoWork কারণ হবে InvalidOperationException

27
System.ComponentModel ব্যবহার করে; (লোকেরা একটি গুগল অনুসন্ধান করা থেকে রক্ষা করতে পারে, এই সহায়ক কোড উদাহরণের জন্য ধন্যবাদ) +1
সাফ্রাইস

@ গ্যান্ট নমুনা কোডের জন্য আপনাকে ধন্যবাদ। আমি যখন আপনার কোডটি চেষ্টা করেছি তখন প্রগ্রেস চেঞ্জড ইভেন্টটি গুলি চালাচ্ছে না। তবে আমি যখন এখানে অনুরূপ স্বীকৃত উত্তরটি চেষ্টা করেছি তখন [ স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / ২২১১676766 / ......... এটি কার্যকর হয়েছে ।
মার্টিন

1
পুনঃটুইট করুন Ctrl +। এই পরিস্থিতিতে আপনাকে সাহায্য! (ধরে
নিচ্ছেন

100

ThreadPool.QueueUserWorkItem কিছু সহজ জন্য সুন্দর আদর্শ। একমাত্র ক্যাভিয়েট অন্য থ্রেড থেকে একটি নিয়ন্ত্রণ অ্যাক্সেস করছে।

System.Threading.ThreadPool.QueueUserWorkItem(delegate {
    DoSomethingThatDoesntInvolveAControl();
}, null);

আমার প্রিয়। জংশনের জন্য একটি দ্রুত লাইন । আমার কাছে এটি স্পিড ডায়াল (স্নিপেট) আছে। নিয়ন্ত্রণগুলির সাথে খুব ভাল কাজ করে। আপনার কেবল ইনভোক এবং ইনভোকেরিকায়ার্ড কীভাবে ব্যবহার করবেন তা জানতে হবে ।
বিটারব্লু

1
+1 নোট করুন যে প্রতিনিধি আপনাকে খুব সুন্দরভাবে প্যারামিটারগুলি মোড়ানোর অনুমতি দেয়।
উইল Bickford

কীভাবে কলব্যাক ফাংশন সহ থ্রেডপুল.কুইউউজারওয়ারকআইটেম ব্যবহার করবেন তার মানে যখন কাজ শেষ হয়ে যায় তখন কল ব্যাক আমাদের জানাবে।
মৌ

76

দ্রুত এবং নোংরা, তবে এটি কার্যকর হবে:

শীর্ষে ব্যবহার:

using System.Threading;

সাধারণ কোড:

static void Main( string[] args )
{
    Thread t = new Thread( NewThread );
    t.Start();
}

static void NewThread()
{
    //code goes here
}

আমি এটিকে কেবলমাত্র এক এক্সপামেলের জন্য একটি নতুন কনসোল অ্যাপ্লিকেশনটিতে ফেলেছি


8
মনে রাখবেন ইসব্যাকগ্রাউন্ডের পতাকাঙ্কিত থ্রেডগুলি রানটাইম দ্বারা স্বয়ংক্রিয়ভাবে শেষ হয় না। এটি অ্যাপ্লিকেশন দ্বারা থ্রেড পরিচালনা প্রয়োজন। আপনি যদি থ্রেডটিকে ব্যাকগ্রাউন্ড হিসাবে চিহ্নিত না করে রেখে থাকেন তবে থ্রেডগুলি কার্যকর করার পরে থ্রেডটি আপনার জন্য সমাপ্ত হবে।
CmdrTallen

14
@ সিএমডিআরটালেন: এটি মোটেই ঠিক নয়। ইসব্যাকগ্রাউন্ড = সত্য চিহ্নযুক্ত একটি থ্রেডের অর্থ এই যে থ্রেডটি প্রক্রিয়াটি প্রস্থান করা থেকে বিরত থাকবে না, যখন ইসব্যাকগ্রাউন্ড = মিথ্যা সহ সমস্ত থ্রেড বেরিয়ে এসেছিল একটি প্রক্রিয়া প্রস্থান করবে
ফিল দেওয়ানি

66

এখানে আরও একটি বিকল্প রয়েছে:

Task.Run(()=>{
//Here is a new thread
});

1
আপনি যদি এইভাবে কোনও থ্রেড তৈরি করেন তবে আপনি কীভাবে এই থ্রেডটিকে ইউআই থ্রেড থেকে থামিয়ে দেবেন?
স্লেয়ারনোহ

1
@slayernoah আপনি এটি একটি প্যারামিটার হিসেবে CancellationTokenSource পাস এবং বাতিল টোকেন বাহিরে থ্রেড সেট করতে পারেন: msdn.microsoft.com/en-us/library/dd997364(v=vs.110).aspx
Spongebob কমরেড

7
এই কোডটি আপনাকে নতুন থ্রেডের গ্যারান্টি দিবে না। আপনি যে থ্রেডপুলটি ব্যবহার করছেন তার বর্তমান প্রয়োগ পর্যন্ত সিদ্ধান্ত up উদাহরণ হিসাবে দেখুন stackoverflow.com/questions/13570579/...
Giulio Caccin

3
@ জিউলিওক্যাসিন থ্রেডপুলের পক্ষে এটির পুল থেকে বিদ্যমান থ্রেড চয়ন করা সম্ভব তবে এটি অবশ্যই আলাদা থ্রেড।
স্পঞ্জবব কমরেড

40

ব্যাকগ্রাউন্ড ওয়ার্কার ক্লাসটি ব্যবহার করে দেখুন । আপনি কী চালাবেন এবং কাজ শেষ হয়ে গেলে আপনাকে অবহিত করার জন্য এটি প্রতিনিধিদের দিয়ে দেন। এমএসডিএন পৃষ্ঠায় একটি উদাহরণ রয়েছে যা আমি সংযুক্ত করেছি।


6
আপনি অবশ্যই থ্রেড শ্রেণীর সাহায্যে এটি করতে পারেন, তবে ব্যাকগ্রাউন্ড ওয়ার্কার আপনাকে থ্রেড সমাপ্তি এবং অগ্রগতি প্রতিবেদনের জন্য এমন পদ্ধতি দেয় যা অন্যথায় নিজেকে কীভাবে ব্যবহার করতে হয় তা নির্ধারণ করতে হবে। ভুলে যাবেন না যে আপনাকে ইউআইয়ের সাথে কথা বলার জন্য ইনভোক ব্যবহার করতে হবে!
রবার্ট রসনি

1
সতর্কতা অবলম্বন করুন: ব্যাকগ্রাউন্ড ওয়ার্কারের কিছু সূক্ষ্ম সীমাবদ্ধতা রয়েছে তবে সাধারণ "আমি চলে যেতে চাই এবং কিছু করতে চাই এবং আমার ফর্মটি প্রতিক্রিয়াশীল রাখতে চাই" এটি দুর্দান্ত।
মেরুস

10
@ মেরুস, আপনি কি এই সূক্ষ্ম সীমাবদ্ধতাগুলি প্রসারিত করতে পারেন?
খ্রিস্টান হুডন

14

আপনি যদি একটি মান পেতে চান:

var someValue;

Thread thread = new Thread(delegate()
            {                 
                //Do somthing and set your value
                someValue = "Hello World";
            });

thread.Start();

while (thread.IsAlive)
  Application.DoEvents();

6

কোনও কোডটিতে সেই কোডটি রাখুন (জিইউআইয়ের মতো একই থ্রেডে কার্যকর করা যায় না এমন কোড) এবং সেই কোডটির সম্পাদনকে ট্রিগার করতে নিম্নলিখিতটি লিখুন।

Thread myThread= new Thread(nameOfFunction);

workerThread.Start();

থ্রেড অবজেক্টে স্টার্ট ফাংশনটি কল করার ফলে আপনার ফাংশন কলটি একটি নতুন থ্রেডে কার্যকর হবে।


3
@ user50612 আপনি কি সম্পর্কে কথা বলছেন? নতুন থ্রেড nameOfFunctionপটভূমিতে চলবে , এবং বর্তমান জিইউআই থ্রেডে নয়। IsBackgroundসম্পত্তি কিনা তা নির্ধারণ করে থ্রেড আবেদন জীবিত বা না রাখা হবে: msdn.microsoft.com/en-us/library/...
Zero3

5

এখানে কীভাবে একটি অগ্রগতি বারের সাহায্যে থ্রেড ব্যবহার করা যায়, থ্রেডগুলি কীভাবে কাজ করে তা বোঝানোর জন্য, ফর্মটিতে তিনটি অগ্রগতি বার এবং 4 টি বোতাম রয়েছে:

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    Thread t, t2, t3;
    private void Form1_Load(object sender, EventArgs e)
    {

        CheckForIllegalCrossThreadCalls = false;

         t = new Thread(birinicBar); //evry thread workes with a new progressBar


         t2 = new Thread(ikinciBar);


         t3 = new Thread(ucuncuBar);

    }

    public void birinicBar() //to make progressBar work
    {
        for (int i = 0; i < 100; i++) {
            progressBar1.Value++;
            Thread.Sleep(100); // this progressBar gonna work faster
        }
    }

    public void ikinciBar()
    {
        for (int i = 0; i < 100; i++)
        {
            progressBar2.Value++;
            Thread.Sleep(200);
        }


    }

    public void ucuncuBar()
    {
        for (int i = 0; i < 100; i++)
        {
            progressBar3.Value++;
            Thread.Sleep(300);
        }
    }

    private void button1_Click(object sender, EventArgs e) //that button to start the threads
    {
        t.Start();
        t2.Start(); t3.Start();

    }

    private void button4_Click(object sender, EventArgs e)//that button to stup the threads with the progressBar
    {
        t.Suspend();
        t2.Suspend();
        t3.Suspend();
    }

    private void button2_Click(object sender, EventArgs e)// that is for contuniue after stuping
    {
        t.Resume();
        t2.Resume();
        t3.Resume();
    }

    private void button3_Click(object sender, EventArgs e) // finally with that button you can remove all of the threads
    {
        t.Abort();
        t2.Abort();
        t3.Abort();
    }
}

3
// following declaration of delegate ,,,
public delegate long GetEnergyUsageDelegate(DateTime lastRunTime, 
                                            DateTime procDateTime);

// following inside of some client method
GetEnergyUsageDelegate nrgDel = GetEnergyUsage;
IAsyncResult aR = nrgDel.BeginInvoke(lastRunTime, procDT, null, null);
while (!aR.IsCompleted) Thread.Sleep(500);
int usageCnt = nrgDel.EndInvoke(aR);

চার্লস আপনার কোড (উপরে) সঠিক নয়। আপনার সমাপ্তির জন্য অপেক্ষা করতে হবে না। ওয়েটহ্যান্ডল সিগন্যাল না হওয়া অবধি এন্ডআইভোক ব্লক করবে।

আপনি যদি সম্পূর্ণ না হওয়া পর্যন্ত অবরুদ্ধ করতে চান তবে আপনার কেবল প্রয়োজন

nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));

বা বিকল্পভাবে

ar.AsyncWaitHandle.WaitOne();

আপনি যদি ব্লক করে থাকেন তবে যে কোনও কল দেওয়ার ইস্যুটি কী? আপনি পাশাপাশি কেবল একটি সিঙ্ক্রোনাস কল ব্যবহার করতে পারেন। আরও ভাল বাজি হ'ল ক্লিনআপের জন্য ল্যাম্বডায় অবরুদ্ধ না হয়ে প্রবেশ করা:

nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);

একটি বিষয় মনে রাখবেন যে আপনাকে অবশ্যই এন্ডআইভোককে কল করতে হবে । অনেকগুলি এটিকে ভুলে যায় এবং ওয়েটহ্যান্ডলকে ফাঁস করে দেয় কারণ বেশিরভাগ অ্যাসিঙ্ক বাস্তবায়ন এন্ডআইভোকে ওয়েটহান্ডেল প্রকাশ করে।


2

আপনি যদি কাঁচা থ্রেড অবজেক্টটি ব্যবহার করতে চলেছেন তবে আপনাকে ন্যূনতম সময়ে ইসব্যাকগ্রাউন্ডটি সত্য করতে হবে এবং আপনার থ্রেডিং অ্যাপার্টমেন্ট মডেল (সম্ভবত এসটিএ) সেট করা উচিত।

public static void DoWork()
{
    // do some work
}

public static void StartWorker()
{
    Thread worker = new Thread(DoWork);
    worker.IsBackground = true;
    worker.SetApartmentState(System.Threading.ApartmentState.STA);
    worker.Start()
}

আপনার যদি ইউআই ইন্টারঅ্যাকশন প্রয়োজন হয় তবে আমি ব্যাকগ্রাউন্ড ওয়ার্কার ক্লাসটি সুপারিশ করব।


ইসব্যাকগ্রাউন্ডকে সত্যে সেট করা সম্পর্কে সতর্ক থাকুন। এটি সম্ভবত আপনি যা ভাবেন তা করেন না। এটি কী করে, সমস্ত পূর্বগ্রাউন্ড থ্রেড মারা যাওয়ার পরে থ্রেডটি মারা যাবে কিনা, বা থ্রেডটি অ্যাপ্লিকেশনটি বাঁচিয়ে রাখবে কিনা তা কনফিগার করে। আপনি যদি নিজের থ্রেডটি মধ্য-প্রয়োগের অবসান করতে না চান তবে ইসব্যাকগ্রাউন্ডটিকে সত্যে সেট করবেন না।
জিরো 3


1

অন্য একটি বিকল্প, এটি প্রতিনিধি এবং থ্রেড পুল ব্যবহার করে ...

'getEnergyUsage' ধরে নেওয়া একটি পদ্ধতি যা একটি ডেটটাইম এবং অন্য একটি ডেটটাইমকে ইনপুট আর্গুমেন্ট হিসাবে গ্রহণ করে এবং ...

// following declaration of delegate ,,,
public delegate long GetEnergyUsageDelegate(DateTime lastRunTime, 
                                            DateTime procDateTime);

// following inside of some client method 
GetEnergyUsageDelegate nrgDel = GetEnergyUsage;                     
IAsyncResult aR = nrgDel.BeginInvoke(lastRunTime, procDT, null, null);
while (!aR.IsCompleted) Thread.Sleep(500);
int usageCnt = nrgDel.EndInvoke(aR);

1
চার্লস, আপনার কোড থেকে কার্যত আলাদা int usageCnt = nrgDel.Invoke(lastRunTime, procDT, null, null);? দেখে মনে হচ্ছে এটি কোনওভাবেই ঘুমের সাথে বর্তমান থ্রেড স্থগিত করে ... আমি ভেবেছিলাম আপনি জিইআইআই থ্রেডে কল করলে এটি জিইউআই
জমা হওয়াতে

হ্যাঁ, বিগিনিভোক প্রতিনিধিটিকে থ্রেড পুল থেকে অন্য থ্রেডে কল করে ... আপনি যদি ইনভোক ব্যবহার করেন তবে প্রতিনিধিটিকে বর্তমান থ্রেডের সাথে সুসংগতভাবে ডাকা হবে ... তবে আপনি ঠিক বলেছেন, ঘুমটি ভুল ... আপনার এটি এবং অপসারণ করা উচিত কলব্যাক ফাংশন ব্যবহার করে ফলাফল সংগ্রহ করুন। আমি এটি দেখানোর জন্য সম্পাদনা করব
চার্লস ব্রেটানা

1

। নেট এ পৃথক থ্রেড চালনার অনেকগুলি উপায় রয়েছে, প্রত্যেকের আলাদা আলাদা আচরণ রয়েছে। জিইউআই ছাড়ার পরে আপনার কি থ্রেড চালিয়ে যাওয়া দরকার? আপনার কি থ্রেড এবং জিইউআইয়ের মধ্যে তথ্য পাস করার দরকার আছে? থ্রেডের কি জিইউআই আপডেট করার দরকার আছে? থ্রেডটি কি তখন কোনও কাজ করা ছেড়ে দেওয়া উচিত, না এটি চালিয়ে যাওয়া উচিত? এই প্রশ্নের উত্তরগুলি আপনাকে কোন পদ্ধতিটি ব্যবহার করতে হবে তা বলে দেবে।

কোড প্রকল্পের ওয়েবসাইটে একটি ভাল অ্যাসিঙ্ক পদ্ধতি নিবন্ধ রয়েছে যা বিভিন্ন পদ্ধতি বর্ণনা করে এবং নমুনা কোড সরবরাহ করে।

দ্রষ্টব্য এই নিবন্ধটি async / অপেক্ষার প্যাটার্ন এবং টাস্ক সমান্তরাল গ্রন্থাগার .NET মধ্যে প্রবর্তনের আগে লেখা হয়েছিল ।


এটি আমি যে ধরণের তথ্যের সন্ধান করছিলাম এটি হ'ল তবে আপনার উত্তরটি লিঙ্ক পচনের শিকার।
ক্রিস

আমাকে জানাতে ধন্যবাদ, @ ক্রিস; লিঙ্ক স্থির।
ডোর হাই আর্চ

0

কীভাবে: ফাইলগুলির জন্য অনুসন্ধান করতে একটি পটভূমি থ্রেড ব্যবহার করুন

অন্যান্য থ্রেড থেকে জিইউআই নির্দিষ্ট স্টাফগুলিতে অ্যাক্সেস নিয়ে আপনাকে খুব যত্নবান হতে হবে (এটি অনেকগুলি জিইআইআই টুলকিটগুলির পক্ষে সাধারণ)। আপনি যদি থ্রেডিং প্রক্রিয়াকরণ থেকে জিইউআইতে কিছু আপডেট করতে চান তবে এই উত্তরটি যা উইনফোর্ডের জন্য দরকারী বলে মনে করেন তা পরীক্ষা করে দেখুন । WPF দেখুন এই (এটা কিভাবে UpdateProgress উপাদান স্পর্শ করতে () মেথড তাই এটি অন্য থ্রেড থেকে কাজ করবে দেখায়, কিন্তু আসলে আমি না মত করছেন না CheckAccess()করছেন সামনে BeginInvokeDispathcer মাধ্যমে দেখতে এবং এটি CheckAccess অনুসন্ধান)

থ্রেডিং উপর .NET নির্দিষ্ট বই খুঁজছেন এবং পাওয়া যায়নি এই এক (বিনামূল্যে ডাউনলোডযোগ্য)। এটি সম্পর্কে আরও তথ্যের জন্য http://www.albahari.com/threading/ দেখুন ।

আমি বিশ্বাস করি যে আপনি প্রথম 20 পৃষ্ঠাগুলিতে এক্সপ্লোরেশনটি নতুন থ্রেড হিসাবে চালু করার জন্য যা প্রয়োজন তা পেয়ে যাবেন এবং এর আরও অনেকগুলি রয়েছে (জিইউআই নির্দিষ্ট স্নিপেটগুলি সম্পর্কে আমি নিশ্চিত না যার অর্থ থ্রেডিংয়ের সাথে কঠোরভাবে নির্দিষ্ট)। সম্প্রদায় এই কাজের জন্য কী ভাবছে তা শুনে খুশি হবেন কারণ আমি এটি পড়ছি। আপাতত আমার জন্য বেশ ঝরঝরে লাগছিল (। নেট নির্দিষ্ট পদ্ধতি এবং থ্রেডিংয়ের জন্য প্রকারগুলি প্রদর্শনের জন্য)। এছাড়াও এটি অন্তর্ভুক্ত করে। নেট 2.0 (এবং প্রাচীন 1.1 নয়) যা আমি সত্যই প্রশংসা করি।


0

আমি জেফ রিখরারের পাওয়ার থ্রেডিং লাইব্রেরি এবং বিশেষত আইএসিএনসিউনমেন্টারটি দেখার পরামর্শ দেব। ভিডিওটি একবার দেখুনচার্লি ক্যালভার্টের ব্লগে যেখানে রিচার একটি ভাল পর্যালোচনার জন্য এটির উপরে চলে গেছে।

নাম দিয়ে বিস্মৃত হবেন না কারণ এটি অ্যাসিক্রোনাস প্রোগ্রামিং কার্যগুলিকে কোড করা সহজ করে দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.