Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Dapatkan pemahaman yang lebih mendalam tentang tugasan dalam C#

Dapatkan pemahaman yang lebih mendalam tentang tugasan dalam C#

PHPz
PHPzasal
2024-02-18 12:03:24565semak imbas

Dapatkan pemahaman yang lebih mendalam tentang tugasan dalam C#

Penjelasan terperinci tentang Tugasan C#, contoh kod khusus diperlukan

Pengenalan:
Dalam pengaturcaraan berbilang benang C#, Task ialah model pengaturcaraan yang biasa digunakan untuk melaksanakan operasi tak segerak. Tugasan menyediakan cara mudah untuk mengendalikan tugas serentak, boleh melakukan operasi tak segerak secara selari pada berbilang urutan dan boleh mengendalikan pengecualian dan mengembalikan nilai dengan mudah. Artikel ini akan memperkenalkan penggunaan C# Task secara terperinci dan memberikan beberapa contoh kod khusus.

1. Penciptaan dan pengendalian Tugas

  1. Kaedah untuk mencipta objek Tugas
    Terdapat banyak cara untuk mencipta objek Tugas dalam C#, tiga berikut biasanya digunakan:
    a. Gunakan kaedah Task.Run mencipta:

    Task task = new Task(() => {
     // 异步任务逻辑
    });

    c Menggunakan kaedah TaskFactory.StartNew untuk mencipta: Task.Run方法创建:

    Task task = Task.Run(() => {
     // 异步任务逻辑
    });

    c. 使用TaskFactory.StartNew方法创建:

    TaskFactory taskFactory = new TaskFactory();
    Task task = taskFactory.StartNew(() => {
     // 异步任务逻辑
    });
  2. Task的启动和等待
    任务创建完成后,可以通过调用Task.Start方法来启动任务的执行。然后可以使用Task.Wait方法来等待任务完成。示例如下:

    task.Start(); // 启动任务
    task.Wait(); // 等待任务完成

    需要注意的是,如果使用Task.RunTaskFactory.StartNew创建的任务,会自动启动,不需要调用Start方法。

  3. Task的取消
    在某些情况下,需要取消一个正在执行的任务。可以使用CancellationToken来实现任务的取消。示例如下:

    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    CancellationToken cancellationToken = cancellationTokenSource.Token;
    
    Task task = Task.Run(() => {
     while (true) {
         // 检查任务是否被取消
         if (cancellationToken.IsCancellationRequested) {
             break;
         }
    
         // 异步任务逻辑
     }
    }, cancellationToken);
    
    // 取消任务
    cancellationTokenSource.Cancel();

    在任务的逻辑中,通过定期检查CancellationToken.IsCancellationRequested属性来判断任务是否需要取消。

二、Task的异常处理和返回值

  1. 异常处理
    在异步任务中,如果发生异常,默认情况下任务会直接抛出异常导致程序崩溃。为了处理任务中的异常,可以在任务中使用try...catch语句来捕获异常,并处理异常的逻辑。示例如下:

    Task task = Task.Run(() => {
     try {
         // 异步任务逻辑
     }
     catch (Exception ex) {
         // 异常处理逻辑
     }
    });
  2. 返回值
    有时候需要从异步任务中获取返回值。使用Task<tresult></tresult>类可以实现任务的返回值传递。TResult是返回值的类型。示例如下:

    Task<int> task = Task.Run(() => {
     // 异步任务逻辑
     return 42;
    });
    
    int result = task.Result;

    在上述示例中,Task<int></int>表示该任务返回一个整数。通过Task.Result属性可以获取到返回值。

三、Task的并行执行
Task可以方便地实现任务的并行执行,提高程序的性能。C#提供了Parallel类来简化并行编程。示例如下:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// 并行执行计算
Parallel.ForEach(numbers, number => {
    Console.WriteLine(number * number);
});

上述示例中,使用Parallel.ForEachrrreee

Permulaan tugas dan menunggu
Selepas penciptaan tugas. selesai , anda boleh memulakan pelaksanaan tugas dengan memanggil kaedah Task.Start. Anda kemudian boleh menggunakan kaedah Task.Wait untuk menunggu tugasan selesai. Contohnya adalah seperti berikut:

rrreee🎜Perlu diingatkan bahawa jika tugasan dibuat menggunakan Task.Run atau TaskFactory.StartNew, ia akan dimulakan secara automatik dan terdapat tidak perlu memanggil kaedah Start. 🎜🎜🎜Pembatalan tugas🎜Dalam sesetengah kes, tugasan yang dilaksanakan perlu dibatalkan. Anda boleh menggunakan CancellationToken untuk membatalkan tugas. Contohnya adalah seperti berikut: 🎜rrreee🎜Dalam logik tugasan, tentukan sama ada tugasan itu perlu dibatalkan dengan kerap menyemak harta CancellationToken.IsCancellationRequested. 🎜🎜2. Pengendalian pengecualian tugas dan nilai pulangan 🎜🎜🎜🎜Pengendalian pengecualian🎜Dalam tugas tak segerak, jika pengecualian berlaku, secara lalai tugas akan membuang pengecualian secara langsung dan menyebabkan program untuk terhempas. Untuk mengendalikan pengecualian dalam tugasan, anda boleh menggunakan pernyataan try...catch dalam tugasan untuk menangkap pengecualian dan mengendalikan logik pengecualian. Contohnya adalah seperti berikut: 🎜rrreee🎜🎜Nilai pulangan🎜Kadangkala anda perlu mendapatkan nilai pulangan daripada tugas tak segerak. Gunakan kelas Task<tresult></tresult> untuk merealisasikan pemindahan nilai pulangan tugas. TResult ialah jenis nilai pulangan. Contohnya adalah seperti berikut: 🎜rrreee🎜Dalam contoh di atas, Task<int></int> bermaksud tugas itu mengembalikan integer. Nilai pulangan boleh diperolehi melalui harta Task.Result. 🎜🎜3. Pelaksanaan Tugasan selari🎜Task boleh dengan mudah melaksanakan pelaksanaan tugasan selari dan meningkatkan prestasi program. C# menyediakan kelas Parallel untuk memudahkan pengaturcaraan selari. Contohnya adalah seperti berikut: 🎜rrreee🎜Dalam contoh di atas, kaedah Parallel.ForEach digunakan untuk melakukan pengiraan segi empat sama pada senarai nombor secara selari. Ia boleh dilihat bahawa tugas pengkomputeran dengan nombor yang berbeza boleh dilaksanakan secara selari pada benang yang berbeza. 🎜🎜Ringkasan: 🎜Artikel ini memperkenalkan penggunaan C# Task secara terperinci dan menyediakan beberapa contoh kod khusus. Dengan menggunakan Tugas, anda boleh melaksanakan operasi tak segerak dengan mudah dan meningkatkan prestasi serentak program. Pada masa yang sama, Task juga menyediakan mekanisme pengendalian pengecualian mudah dan penyampaian nilai pulangan, menjadikan pengaturcaraan serentak lebih fleksibel dan lebih mudah untuk diselenggara. Saya berharap pembaca akan mempunyai pemahaman yang lebih mendalam tentang Tugasan C# melalui pengenalan dan contoh artikel ini, dan boleh menggunakannya secara fleksibel dalam projek sebenar. 🎜

Atas ialah kandungan terperinci Dapatkan pemahaman yang lebih mendalam tentang tugasan dalam C#. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn