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

我有这种方法,我想异步运行,以便我可以在运行时做其他事情。 它不依赖于任何其他Async方法(它不会调用另一个资源,下载文件或任何东西)。 我想避免使用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()); 

在.NET环境中有多种异步执行代码的方法。 看看MSDN的异步编程模式 。

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

因此,如果没有Tasks,您可以自己启动一个线程,或者使用ThreadPool (任务在内部完成)。

 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; }