C# 如何在没有新线程或async和Wait关键字但只有Task的情况下获得异步
我想知道如何在不使用额外线程或C# 如何在没有新线程或async和Wait关键字但只有Task的情况下获得异步,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,我想知道如何在不使用额外线程或await和async关键字而仅使用任务的情况下完成下面程序所做的同样的事情。一个示例代码将非常棒。在我看来,我们需要使用IO绑定操作或任何长时间运行的操作的TaskCompletionSource和Async版本 static void Main(string[] args) { Task t = Go(); Console.WriteLine("Hello World"); Task.Delay(1000).GetAwaiter().OnComple
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;
}
static void Main(字符串[]args)
{
任务t=Go();
Console.WriteLine(“你好世界”);
Task.Delay(1000.GetAwaiter().OnCompleted(()=>{Console.WriteLine(“Completed”);});
Console.ReadLine();
}
静态异步任务Go()
{
var task=PrintAnswerToLife();
等待任务;
控制台。写入线(“完成”);
}
静态异步任务PrintAnswerToLife()
{
var task=GetAnswerToLife();
int-answer=等待任务;
控制台。写线(应答);
}
静态异步任务GetAnswerToLife()
{
var任务=任务延迟(2000);
等待任务;
int-answer=21*2;
返回答案;
}
您可以使用ContinueWith
将异步
/等待
转换为任务
。也可以进行其他转换,例如,Task.Delay
变成System.Threading.Timer
基本模式是,对于任何执行等待
的异步
方法:
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;
}
静态任务Go()
{
var tcs=new TaskCompletionSource();
var task=PrintAnswerToLife();
task.ContinueWith(=>
{
控制台。写入线(“完成”);
tcs.SetResult(空);
});
返回tcs.Task;
}
正确的错误处理需要更多的工作。通过使用
ContinueWith
,您可以将异步
/等待
转换为任务
。也可以进行其他转换,例如,Task.Delay
变成System.Threading.Timer
基本模式是,对于任何执行等待
的异步
方法:
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;
}
静态任务Go()
{
var tcs=new TaskCompletionSource();
var task=PrintAnswerToLife();
task.ContinueWith(=>
{
控制台。写入线(“完成”);
tcs.SetResult(空);
});
返回tcs.Task;
}
正确的错误处理需要更多的工作。请检查这不是一件容易的事task@zahir似乎是一个很好的链接。非常感谢。请检查这不是一件容易的事task@zahir似乎是一个很好的链接。非常感谢。实际上还有一件事,
ContinueWith
应该在与原始方法相同的同步上下文中工作。很好。在本例中,这并不重要,但通常ContinueWith
应采用TaskScheduler。从CurrentSynchronizationContext
。实际上还有一件事,ContinueWith
应在与原始方法相同的同步上下文中工作。很好。在本例中,这并不重要,但通常情况下,ContinueWith
应采用TaskScheduler.FromCurrentSynchronizationContext
。