c# - 如何异步这个长时间运行的方法?

标签 c# .net asynchronous async-await task-parallel-library

我有这个方法,我想异步运行它,这样我就可以在它运行时做其他事情。它不依赖于任何其他异步方法(它不调用另一个资源、下载文件或任何东西)。如果可能,我想避免使用 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 中并将其标记为异步。等待会去哪里?

最佳答案

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

如果您在该方法中执行一些异步操作,例如 Task.Delay 或一些非阻塞 I/O,则调用该方法,等待返回的任务并使方法本身异步:

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

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

var task = Task.Run(() => RunMySlowLogic());

关于c# - 如何异步这个长时间运行的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32617702/

相关文章:

c# - 使用 OAuth2 保护和访问 .NET 核心 WebApi 服务

在模拟器而不是打印机上执行的打印机的 C# POS 代码

.net - 尝试调用两个功能时Windows窗体卡住

c# - 从资源管理的角度来看,如何处理对 Task.Run 的多个请求?

asynchronous - Kotlin中的异步预定作业

c# - 如何向现有 Winforms 控件添加属性

c# - 将 Entity Framework Linq 与存储过程混合

c# - 如何使用反射访问私有(private)基类字段

c# - 无法将 lambda 表达式转换为类型 "...",因为它不是委托(delegate)类型

javascript - 测试所有已终止的功能