Để chạy mã không đồng bộ (ví dụ như với async/await), tôi cần một Nhiệm vụ phù hợp. Tất nhiên có một số phương pháp được xác định trước trong khuôn khổ bao gồm các hoạt động thường xuyên nhất, nhưng đôi khi tôi muốn viết của riêng tôi. Tôi mới tham gia C# nên rất có thể tôi đã làm sai, nhưng tôi ít nhất cũng không hoàn toàn hài lòng với thực tiễn hiện tại của mình. Xem ví dụ sau đây cho những gì tôi đang làm:Cách viết đúng phương thức trả về tùy chỉnh Tác vụ
public async Task<bool> doHeavyWork()
{
var b1 = await this.Foo();
//var b2 = await Task<bool>.Factory.StartNew(Bar); //using Task.Run
var b2 = await Task.Run(()=>Bar());
return b1 & b2;
}
public Task<bool> Foo()
{
return Task.Factory.StartNew(() =>
{
//do a lot of work without awaiting
//any other Task
return false;
});
}
public bool Bar()
{
//do a lot of work without awaiting any other task
return false;
}
Nói chung tôi tạo ra và tiêu thụ các phương pháp như vậy giống như ví dụ Foo, nhưng có một lambda 'thêm' chứa logic phương pháp toàn bộ mà không nhìn imho rất đẹp. Một tùy chọn khác là sử dụng bất kỳ phương thức nào như ví dụ Bar, tuy nhiên tôi nghĩ điều đó thậm chí còn tồi tệ hơn vì không rõ phương thức này nên chạy async (ngoài các tên phương thức thích hợp như BarAsync) và Task.Factory.StartNew có thể phải được lặp lại nhiều lần trong chương trình. Tôi không biết làm thế nào để nói với trình biên dịch ‘phương thức này trả về một nhiệm vụ, hãy quấn nó thành một nhiệm vụ khi được gọi là 'đó là điều tôi muốn làm.
Cuối cùng câu hỏi của tôi: Cách tốt nhất để viết một phương pháp như vậy là gì? Tôi có thể loại bỏ "lambda" phụ (không thêm một phương thức có tên bổ sung)?
EDIT Vì Servy đã cho biết luôn có lý do chính đáng để có phiên bản đồng bộ của phương pháp. Phiên bản async chỉ nên được cung cấp nếu absolutley cần thiết (liên kết của Stephen Cleary).
'" mà không thêm phương thức bổ sung có tên khóa học "' tại sao lại từ chối tùy chọn đó? Tạo 'public bool Bar' và' public Task BarAsync'. –
Servy
Tôi muốn tránh chi phí. Nếu nó có ý nghĩa để sử dụng một phương pháp hoặc đồng bộ hoặc không đồng bộ sẽ được sử dụng tốt. Nếu không có một BarAsync công cộng và một Bar riêng (để ẩn nó) và trong trường hợp này tôi không thấy nhiều lý do cho nó. – marce