Tôi có một phương pháp không đồng bộ sau khi hoàn thành mà tôi muốn chạy một phương pháp khác. Điều này hoạt động tốt nếu tôi chỉ cần gọi phương thức và thêm .ContinueWith()Tạo một nhiệm vụ lạnh có thể chờ đợi
Tuy nhiên, tôi có yêu cầu mới chỉ bắt đầu tác vụ nếu tôi có thể thêm nó vào một từ điển đồng thời.
Tôi muốn xây dựng nhiệm vụ, cố gắng để thêm nó và sau đó bắt đầu nhiệm vụ
Tuy nhiên, có vẻ như Task.Start() ngay lập tức hoàn thành nhiệm vụ gây ra tiếp tục hành động để chạy và bất cứ chờ đợi để .. không đợi.
ai cũng có thể giải thích tại sao điều này xảy ra và đúng cách để đạt được mục tiêu của tôi?
namespace UnitTestProject2
{
[TestClass]
public class taskProblem
{
[TestMethod]
public void Test()
{
CancellationTokenSource cancel = new CancellationTokenSource();
ConcurrentDictionary<Guid, Task> tasks = new ConcurrentDictionary<Guid,Task>();
Guid id = Guid.NewGuid();
Task t = new Task(async() => await Get(), cancel.Token);
t.ContinueWith(Complete);
if (tasks.TryAdd(id, t))
{
t.Start();
}
else
{
//another thread is stopping stuff dont start new tasks
}
t.Wait(); //expected to wait for the get function to complete
Console.WriteLine("end test");
}
public async Task Get()
{
Console.WriteLine("start task");
await Task.Delay(10000);
Console.WriteLine("end task");
}
public void Complete(Task t)
{
Console.WriteLine("Complete");
}
}
}
đầu ra:
start task
end test
Complete
đầu ra mong đợi:
start task
end task
Complete
end test
Cập nhật: Có vẻ không có cách nào để tạo một nhiệm vụ mới mà sẽ không ngay lập tức bắt đầu hoặc hoàn thành ngay lập tức trên Task.Start?
Vấn đề thực sự bạn đang cố gắng giải quyết là gì?Yêu cầu làm cho không có ý nghĩa và gói Nhiệm vụ hai cấp độ sâu không giúp đỡ. Có * không bao giờ * một lý do chính đáng để tạo các nhiệm vụ lạnh và gọi 'Bắt đầu'. Hơn nữa, không có lý do gì để bọc 'Get' mà đã trả về một Task đang hoạt động bên trong một cái khác. Chỉ cần viết 'Task t = Get();'. Đối với yêu cầu, nó không có ý nghĩa. Bạn luôn có thể thêm một mục mới vào một từ điển đồng thời vì bạn đang thực sự tạo một khóa Guid mới cho nó. –
Dường như bạn đang truyền một đại biểu async vào hàm tạo 'Task' mà sẽ không đợi nhiệm vụ được trả về từ' Get' để hoàn tất. Tại sao bạn đang cố gắng để bọc các cuộc gọi để 'Get' trong một nhiệm vụ khác? – Lee
ứng dụng thực gửi thông báo đẩy từ hàng đợi và có phương thức Stop() (được gọi từ một chuỗi khác) để ngừng bắt đầu nhiệm vụ mới. Trong trường hợp này, tôi cần tác vụ không bắt đầu để tôi có thể thêm nó vào từ điển đồng thời trong một chuỗi an toàn. rõ ràng có những cách khác để làm điều này mà tôi sẽ bị buộc phải sử dụng nếu tôi không thể hình này ra – Ewan