如何异步这个长 运行 方法?
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;
}
我有这个方法,我想 运行 异步,这样我就可以在它 运行 的时候做其他事情。它不依赖于任何其他异步方法(它不调用另一个资源、下载文件或任何东西)。如果可能,我想避免使用 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;
}