Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在没有新线程或async和Wait关键字但只有Task的情况下获得异步_C#_.net_Asynchronous_Async Await - Fatal编程技术网

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