Tôi có một tình huống mà tôi có một cây đối tượng được tạo ra bởi một nhà máy đặc biệt. Điều này là hơi giống với một container DI, nhưng không hoàn toàn.Force C# nhiệm vụ không đồng bộ để được lười biếng?
Tạo đối tượng luôn xảy ra thông qua hàm tạo và đối tượng không thay đổi.
Một số phần của cây đối tượng có thể không cần thiết trong một thực thi nhất định và phải được tạo ra một cách lười biếng. Vì vậy, các đối số constructor nên là một cái gì đó mà chỉ là một nhà máy để tạo theo yêu cầu. Điều này trông giống như một công việc cho Lazy
.
Tuy nhiên, việc tạo đối tượng có thể cần truy cập tài nguyên chậm và do đó luôn không đồng bộ. (Chức năng tạo của nhà máy đối tượng trả về một Task
.) Điều này có nghĩa là chức năng tạo cho Lazy
sẽ cần phải không đồng bộ, và do đó loại được tiêm cần phải là Lazy<Task<Foo>>
.
Nhưng tôi không muốn có gói kép. Tôi tự hỏi liệu có thể ép buộc Task
trở nên lười biếng, tức là tạo ra một Task
được đảm bảo không thực thi cho đến khi nó được chờ đợi. Theo tôi hiểu, Task.Run
hoặc Task.Factory.StartNew
có thể bắt đầu thực hiện bất kỳ lúc nào (ví dụ: nếu chuỗi từ hồ bơi ở chế độ rảnh), ngay cả khi không có gì đang chờ.
public class SomePart
{
// Factory should create OtherPart immediately, but SlowPart
// creation should not run until and unless someone actually
// awaits the task.
public SomePart(OtherPart eagerPart, Task<SlowPart> lazyPart)
{
EagerPart = eagerPart;
LazyPart = lazyPart;
}
public OtherPart EagerPart {get;}
public Task<SlowPart> LazyPart {get;}
}
hữu ích này? https://blogs.msdn.microsoft.com/pfxteam/2011/01/15/asynclazyt/ – DavidG
@DavidG Cảm ơn, tôi đã đọc bài viết này trước đây. Đây sẽ là cách giải quyết mà tôi sẽ sử dụng nếu tôi không thể tạo ra một 'Task' đơn giản, nhưng tôi vẫn hy vọng có một cách để làm điều đó. –
Chờ đợi sẽ không bắt đầu một nhiệm vụ cho bạn nếu nó chưa được khởi động, vì vậy bạn không thể "tạo một Tác vụ được đảm bảo không thực thi cho đến khi nó được chờ đợi" (trừ khi bạn tự khởi động nó trước khi chờ đợi xảy ra). – Evk