2010-09-21 40 views
9

Hi bình thường tôi sẽ làm điều này với một Nhân viên nền, nhưng tôi muốn làm điều đó với C# Task, chỉ để hiểu Task tốt hơn.Chạy nhiều C# Tác vụ Async

Cái này là tôi có một lớp với các thuộc tính sau

private int _number1; 
    public int Number1 
    { 
     get { return _number1; } 
     set { _number1 = value; OnPropertyChanged("Number1");} 
    } 

    private int _number2; 
    public int Number2 
    { 
     get { return _number2; } 
     set { _number2 = value; OnPropertyChanged("Number2");} 
    } 

Xin lưu ý rằng tôi sử dụng INotifyPropertyChanged.

Number1 = Task<int>.Factory.StartNew(() => GenerateResult()).Result; 
Number2 = Task<int>.Factory.StartNew(() => GenerateResult2()).Result; 

GenerateResult và GenerateResult2 chỉ là phương pháp dumme, người ngủ và sau đó trả về một số.

Tôi làm cách nào để công việc này không đồng bộ? Kể từ bây giờ, GenerateResult2() được gọi đầu tiên khi GenerateResult() kết thúc.

Tôi cần nó để có thể hoạt động Async, vì tôi không biết khi nào mỗi tác vụ sẽ kết thúc hoặc thậm chí nếu nó kết thúc.

Trả lời

13

Khi bạn nhận được tài sản Result, bạn đang đợi công việc hoàn thành một cách hiệu quả. Nó sẽ thực hiện trên một chủ đề nền nhưng bạn đang chờ đợi trong chủ đề chính của bạn để hoàn thành trước khi bạn bắt đầu chủ đề tiếp theo.

Xem chi tiết MSDN doc.

Bạn nên có thể chỉ cần gán thuộc tính của bạn từ các sợi nền:

Task<int>.Factory.StartNew(() => Number1 = GenerateResult()); 

WPF databinding sẽ take care of marshalling sự kiện PropertyChanged để thread phối chính xác.

+0

Cảm ơn rất nhiều Isak Savo làm việc hoàn hảo và rất đơn giản để đọc :-) Rất dễ dàng hơn sau đó Backgroundworkers – gulbaek

+0

Nó không phải là xác định rằng bất kỳ nhiệm vụ sẽ thực hiện tất cả các thời gian trên một sợi công nhân. Kết quả chỉ đơn giản là chặn chuỗi được gọi là nó cho đến khi nó sẵn sàng xuất dữ liệu hoặc đặt một ngoại lệ. –

+0

Cảm ơn bạn, tôi đã có một dòng gỡ lỗi được gọi. Rất tiếc vì vậy tôi có thể làm một bài kiểm tra nhanh và nó đã phá vỡ async: O – John

-4
Task<int>.Factory.StartNew(() => GenerateResult2()).ContinueWith(() => GenerateResult()); 
+5

Trừ khi tôi nhầm, đây chính là ngữ nghĩa giống như mã OP - nhiệm vụ thứ hai không được bắt đầu cho đến khi lần đầu tiên hoàn thành. –

3

Tôi đã kiểm tra điều này: Task Parallelism (Task Parallel Library) và nó tuyên bố rằng khi sử dụng System.Threading.Tasks.Task<TResult> các Tác vụ sẽ chạy không đồng bộ và có thể hoàn thành theo bất kỳ thứ tự nào. Nếu kết quả được truy cập trước khi tính toán hoàn thành, thuộc tính sẽ chặn luồng cho đến khi giá trị có sẵn.

Tôi nghĩ điều đó có nghĩa là nếu bạn đang truy cập .Result trước khi nó có giá trị, như bạn đang làm trong mã mẫu, bạn sẽ phải chờ cho đến khi hoàn thành trước.

Có ý nghĩa khi thuộc tính Result sẽ không được điền cho đến khi Tác vụ hoàn tất.

+2

Không thấy câu trả lời của Isak Savo đã chỉ ra rằng truy cập Kết quả sẽ chờ đợi nhiệm vụ hoàn thành . – Nope

Các vấn đề liên quan