如何调用异步方法
How to call async methods
假设有一个方法
async static System.Threading.Tasks.Task Do()
{
//do sth
await Task.Delay(10000);
}
现在,当我用
调用方法时
Do();
它会创建一个新线程吗?或者我必须创建一个线程如下
Task.Factory.StartNew(() => Do());
Do
没有创建话题。
await 之前的部分在调用线程上运行,并且在延迟期间根本没有线程。 Task.Delay
在内部使用计时器,它不会在整个操作过程中占用线程。
当延迟完成时,使用ThreadPool中的一个线程继续执行该方法。
关于Task.Factory.StartNew
,你为什么要创建一个线程?如果您需要将 CPU 密集型方法卸载到线程池,那很好(尽管 Task.Run
更可取)但如果您不这样做,则只需调用 Do
并等待结果:
await Do();
如果您坚持要为 Do
创建一个新线程,您需要使用 TaskCreationOptions.LongRunning
:
Task.Factory.StartNew(() => Do(), TaskCreationOptions.LongRunning);
但是由于 Do
是一种异步方法,当它到达第一个等待时释放线程,这没有任何意义,正如我在我的博客上解释的那样:LongRunning Is Useless For Task.Run With async-await
我所有的案例都是这样的:
public void Start(Action action)
{
Token = CancellationToken.None;
IsRunning = true;
Task.Factory.StartNew(() => Do(action), TaskCreationOptions.LongRunning);
}
async Task Do(Action action)
{
while (IsRunning)
{
action();
await Task.Delay(Interval, Token);
}
}
然后我调用 Start() 并使用五个具有不同间隔的不同操作。
这样使用正确吗?
假设有一个方法
async static System.Threading.Tasks.Task Do()
{
//do sth
await Task.Delay(10000);
}
现在,当我用
调用方法时Do();
它会创建一个新线程吗?或者我必须创建一个线程如下
Task.Factory.StartNew(() => Do());
Do
没有创建话题。
await 之前的部分在调用线程上运行,并且在延迟期间根本没有线程。 Task.Delay
在内部使用计时器,它不会在整个操作过程中占用线程。
当延迟完成时,使用ThreadPool中的一个线程继续执行该方法。
关于Task.Factory.StartNew
,你为什么要创建一个线程?如果您需要将 CPU 密集型方法卸载到线程池,那很好(尽管 Task.Run
更可取)但如果您不这样做,则只需调用 Do
并等待结果:
await Do();
如果您坚持要为 Do
创建一个新线程,您需要使用 TaskCreationOptions.LongRunning
:
Task.Factory.StartNew(() => Do(), TaskCreationOptions.LongRunning);
但是由于 Do
是一种异步方法,当它到达第一个等待时释放线程,这没有任何意义,正如我在我的博客上解释的那样:LongRunning Is Useless For Task.Run With async-await
我所有的案例都是这样的:
public void Start(Action action)
{
Token = CancellationToken.None;
IsRunning = true;
Task.Factory.StartNew(() => Do(action), TaskCreationOptions.LongRunning);
}
async Task Do(Action action)
{
while (IsRunning)
{
action();
await Task.Delay(Interval, Token);
}
}
然后我调用 Start() 并使用五个具有不同间隔的不同操作。 这样使用正确吗?