Tar*_*rik 0 .net c# asynchronous async-await
我不知道如何完成下面的程序做同样的事情,而无需使用额外的线程或 await和async关键字,但只有任务.示例代码非常棒.在我看来,我们需要使用TaskCompletionSource和Async绑定IO操作或任何长时间运行的操作.
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;
}
Run Code Online (Sandbox Code Playgroud)
你可以做一个非常简单的平移async/ await成Task使用ContinueWith.其他翻译也是可能的,例如Task.Delay变为System.Threading.Timer.
对于任何执行以下操作的async方法,基本模式是await:
static async Task Go()
{
var task = PrintAnswerToLife();
await task;
Console.WriteLine("Done");
}
Run Code Online (Sandbox Code Playgroud)
变为:
static Task Go()
{
var tcs = new TaskCompletionSource<object>();
var task = PrintAnswerToLife();
task.ContinueWith(_ =>
{
Console.WriteLine("Done");
tcs.SetResult(null);
});
return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)
正确的错误处理是一项更多的工作.