如何异步这个长 运行 方法?

How to async this long running method?

我有这个方法,我想 运行 异步,这样我就可以在它 运行 的时候做其他事情。它不依赖于任何其他异步方法(它不调用另一个资源、下载文件或任何东西)。如果可能,我想避免使用 new Task()Task.Factory.StartTask()Task.Run()

是否可以异步地运行此方法,使用整洁、可读的代码并且不显式使用 Task?

如果不是,运行异步调用该方法的最简洁方法是什么?

注意:请不要担心方法中的愚蠢逻辑 - 我已经将其归结为故意放慢但没有显示我的实际代码。

public static void main(string[] args)
{
  RunMySlowLogic();
}

private void RunMySlowLogic()
{
  while (true)
    for (int i=0; i<100000000;i++)
      if (i == new Random().Next(999))
        return true;
}

目前,我认为我需要将方法包装在 lambda 或 Task 中并将其标记为异步。 await 会去哪里?

你混淆了两个不同的东西。后台可以运行this,这个方法可以异步。这是两件不同的事情,您的方法可以做其中一件,也可以同时做两件事情。

如果你在那个方法中做一些异步的事情,比如 Task.Delay 或一些非阻塞 I/O 然后调用那个方法,等待返回的任务并使方法本身异步:

async Task RunMySlowLogicAsync()
{
    while (true)
    {
        // ...
        await Task.Delay(1000);
    }
}

如果您没有这样的东西,那么您的方法不是异步的,而是同步的。你仍然可以 运行 它在不同的 (ThreadPool) 线程的后台,同时你使用 Task.Run:

做其他事情
var task = Task.Run(() => RunMySlowLogic());

在 .NET 环境中有多种异步执行代码的方法。看看 Asynchronous Programming Patterns MSDN article.

任务是为了让你的工作更轻松。我认为避免使用任务的唯一正当理由是当您针对旧版本的 .NET 时。

所以如果没有 Tasks,您可以自己启动一个线程,或者使用 ThreadPool(Tasks 在内部执行此操作)。

public static void main(string[] args)
{
  var are = new AutoResetEvent(false);
  ThreadPool.QueueUserWorkItem(RunMySlowLogicWrapped, are);
  // Do some other work here
  are.WaitOne();
}

// you have to match the signature of WaitCallback delegate, we can use it to communicate cross-thread
private void RunMySlowLogicWrapped(Object state) {
  AutoResetEvent are = (AutoResetEvent) state;
  RunMySlowLogic();
  are.Set();
}

private bool RunMySlowLogic() 
{
  while (true)
    for (int i=0; i<100000000;i++)
      if (i == new Random().Next(999))
        return true;
}