Tôi hiện đang cố gắng thực hiện thay thế cho phương thức Task.Delay()
của Net 4.5 trong chương trình phải nhắm mục tiêu .Net 4.0. Tôi tìm thấy mã sau tại this blog.Hủy bỏ chậm trễ công việc trong .Net 4.0
/* You can write Task-based asynchronous methods by utilizing a TaskCompletionSource.
A TaskCompletionSource gives you a 'slave' Task that you can manually signal.
Calling SetResult() signals the task as complete, and any continuations kick off. */
void Main()
{
for (int i = 0; i < 10000; i++)
{
Task task = Delay (2000);
task.ContinueWith (_ => "Done".Dump());
}
}
Task Delay (int milliseconds) // Asynchronous NON-BLOCKING method
{
var tcs = new TaskCompletionSource<object>();
new Timer (_ => tcs.SetResult (null)).Change (milliseconds, -1);
return tcs.Task;
}
Tasks
hoàn toàn mới đối với tôi. System.Threading.Timer
và TaskCompletionSource
là thương hiệu mới đối với tôi (tính đến hôm nay) và tôi đang gặp khó khăn với họ. Tất cả những điều đó sang một bên, tôi tự hỏi làm thế nào tôi có thể thêm chức năng CancellationToken
vào mã này. Tôi giả định tôi có thể thêm một tham số cho phương thức Delay()
như thế này:
Task Delay (int milliseconds, CancellationToken token) // Asynchronous NON-BLOCKING method
{
var tcs = new TaskCompletionSource<object>();
new Timer (_ => tcs.SetResult (null)).Change (milliseconds, -1);
return tcs.Task;
}
... nhưng sau đó, nơi nào tôi đặt logic để kiểm tra thẻ và nhận ra của phương pháp này? Một nơi nào đó trong cuộc gọi lại? Điều này thậm chí có thể?
Microsoft cung cấp gói NuGet [Microsoft.Bcl.Async] (https://www.nuget.org/packages/Microsoft.Bcl.Async/) giúp backport nhiều trong số 4,5 tính năng bổ sung thành 4.0. Bạn có thể truy cập trễ thông qua 'TaskEx.Delay()' nếu bạn có gói. –