Công việc có được tạo dưới dạng chủ đề nền không?


85

Tôi chỉ tự hỏi liệu lớp Tác vụ mới trong dot.net 4 đang tạo một luồng nền hay nền trước?

Thông thường tôi sẽ đặt "IsBackground" trên một Chủ đề, nhưng không có thuộc tính nào như vậy trên một Tác vụ.

Tôi không thể tìm thấy bất kỳ tài liệu nào về điều này trên MSDN :-(

Câu trả lời:


119

Không khó để xác minh:

class Program
{
    static void Main()
    {
        Task
            .Factory
            .StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
            .Wait();
    }
}

Và câu trả lời là ...

ǝnɹʇ


Tôi đang gặp sự cố trong đó tất cả các tác vụ của tôi đang chạy trên chuỗi cuộc gọi. Tôi đã dán dòng mã chính xác ở trên vào dự án của mình và nó báo cáo "sai". Bạn có biết tại sao có thể như vậy không? Tôi đang sử dụng .NET 4.0.
— Trevor Elliott

8
Theo luồng này stackoverflow.com/questions/7889746/…, bạn không được đảm bảo một luồng nền khi bắt đầu một tác vụ, nhưng bạn nên làm như vậy nếu sử dụng TaskCreationOptions.LongRunning. Tôi đang sử dụng tùy chọn đó và nó vẫn không tạo luồng nền. Đưa cái gì?
— Trevor Elliott

nó có thể được cấu hình không?
— Royi Namir

2
Tôi tin rằng vấn đề của Moozhe có thể là với bối cảnh đồng bộ hóa mặc định. Hành vi có thể khác nhau tùy thuộc vào việc bạn sử dụng ứng dụng WinForms, WPF, Web hay Console vì tất cả chúng đều có các cách mặc định khác nhau để lập lịch các tác vụ đồng thời.
— jpierson

5
thích câu trả lời của bạn: "ǝnɹʇ". Vui lắm. Cảm ơn bạn.
— teddy

12

Nếu bạn đang bắt đầu Task<T>sử dụng Task.Run(), thì có.

Nếu bạn đang sử dụng asyncvà await, thì không. Trích từ đây :

"Các từ khóa async và await không tạo ra các chuỗi bổ sung. Các phương thức async không yêu cầu đa luồng vì một phương thức async không chạy trên chính chuỗi của nó. Phương thức này chạy trên ngữ cảnh đồng bộ hóa hiện tại và sử dụng thời gian trên chuỗi chỉ khi phương thức đang hoạt động. Bạn có thể sử dụng Task.Run để di chuyển công việc liên quan đến CPU sang một luồng nền, nhưng một luồng nền không giúp ích gì cho quá trình chỉ chờ kết quả có sẵn. "


1
Vì bạn đang sử dụng Task.Run, nó sẽ nằm trên chuỗi nền, nhưng nếu nó gặp phải lỗi chờ đợi thì nó có thể làm điều gì đó đặc biệt để tạm dừng chuỗi và chờ kết quả. Đáng điều tra.
— Steztric,


0

Các tác vụ được thực thi bởi các luồng đến từ nhóm luồng hệ thống. Một luồng đến từ nhóm luồng được thực thi trong nền theo mặc định.


-1

Nếu bạn chưa bị thuyết phục về một nhiệm vụ nền, chỉ cần cố gắng truy cập một phần tử GUI từ bên trong một Tác vụ như:

public async Task<int> ProcessStuff_Async()
{
    while(true)
    {
        label1.Text = "processing next item";

để lấy ngoại lệ thời gian chạy:

Thao tác xuyên luồng không hợp lệ: Điều khiển 'label1' được truy cập từ một luồng khác với luồng mà nó được tạo.

giống như với các chủ đề nền thông thường cũ tốt.

Có thông tin trong tài liệu MSDN (tính đến năm 2017 :-), ví dụ:

Cách tốt nhất để xử lý điều này ... là bắt đầu một chuỗi nền thực hiện công việc bằng Task.Run và chờ đợi kết quả của nó. Điều này sẽ cho phép giao diện người dùng cảm thấy mượt mà khi công việc đang được thực hiện.

Tài liệu này thậm chí còn có một phần What happens under the covers.


Việc kiểm tra của bạn chỉ xác nhận rằng tác vụ chạy trong chuỗi của chính nó, không phải rằng chuỗi đó là một chuỗi nền. Một luồng nền là một luồng, nếu vẫn đang thực thi, sẽ không ngăn chương trình kết thúc.
— Sören Kuklau
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.