我想知道如何在不使用额外线程或await
和async
关键字但仅使用任务的情况下完成以下程序所做的相同事情。示例代码非常棒。在我看来,我们需要使用IO绑定操作的TaskCompletionSource
和Async
版本或任何长期运行的操作。
static void Main(string[] args)
{
Task t = Go();
Console.WriteLine("Hello World");
Task.Delay(1000).GetAwaiter().OnCompleted(() => { Console.WriteLine("Completed"); });
Console.ReadLine();
}
static async Task Go()
{
var task = PrintAnswerToLife();
await task;
Console.WriteLine("Done");
}
static async Task PrintAnswerToLife()
{
var task = GetAnswerToLife();
int answer = await task;
Console.WriteLine(answer);
}
static async Task<int> GetAnswerToLife()
{
var task = Task.Delay(2000);
await task;
int answer = 21 * 2;
return answer;
}
答案 0 :(得分:5)
您可以使用async
对await
/ Task
进行ContinueWith
非常直接的翻译。其他翻译也是可能的,例如,Task.Delay
变为System.Threading.Timer
。
基本模式适用于执行async
的任何await
方法:
static async Task Go()
{
var task = PrintAnswerToLife();
await task;
Console.WriteLine("Done");
}
变为:
static Task Go()
{
var tcs = new TaskCompletionSource<object>();
var task = PrintAnswerToLife();
task.ContinueWith(_ =>
{
Console.WriteLine("Done");
tcs.SetResult(null);
});
return tcs.Task;
}
正确的错误处理工作要多得多。