C# 使用Task.Run(NonAsyncMethod())等待是否更好?
比如说,我接到这样一个电话:C# 使用Task.Run(NonAsyncMethod())等待是否更好?,c#,.net,task-parallel-library,async-await,C#,.net,Task Parallel Library,Async Await,比如说,我接到这样一个电话: await Task.Run(async() => SomeLongRunningNonAsyncMethod()); 我的理解是,当调用SomeLongRunningNonAsyncMethod()时,调用在遇到wait之前不会返回。但是在SomeLongRunningNonAsyncMethod()中没有等待 那么,这与直接调用SomeLongRunningNonAsyncMethod()相同吗 你的理解确实有缺陷 当代码执行到达wait Task.Ru
await Task.Run(async() => SomeLongRunningNonAsyncMethod());
我的理解是,当调用SomeLongRunningNonAsyncMethod()时,调用在遇到wait之前不会返回。但是在SomeLongRunningNonAsyncMethod()中没有等待
那么,这与直接调用SomeLongRunningNonAsyncMethod()相同吗 你的理解确实有缺陷 当代码执行到达
wait Task.Run
时,它将首先执行Task.Run
(它将在线程池中对方法进行排队),然后立即返回。当任务.Run
中的方法完成时,执行将在等待后继续执行
这是否有用很大程度上取决于您的上下文。例如,如果您是从WinForms/WPF应用程序中的事件处理程序调用它,那么这确实是一种很好的方法,可以避免在执行一些后台工作时阻塞UI线程。如果您在web应用程序中执行此操作,那么您只是无缘无故地导致线程切换和线程池线程
如果您在任务中执行I/O。请运行,而不是CPU工作,您希望找到一个异步API来执行相同的I/O工作-这将为您节省在I/O请求完成时仍会阻塞的线程。您的理解确实有缺陷
当代码执行到达wait Task.Run
时,它将首先执行Task.Run
(它将在线程池中对方法进行排队),然后立即返回。当任务.Run
中的方法完成时,执行将在等待后继续执行
这是否有用很大程度上取决于您的上下文。例如,如果您是从WinForms/WPF应用程序中的事件处理程序调用它,那么这确实是一种很好的方法,可以避免在执行一些后台工作时阻塞UI线程。如果您在web应用程序中执行此操作,那么您只是无缘无故地导致线程切换和线程池线程
如果您在任务中执行I/O。请运行,而不是CPU工作,您希望找到一个异步API来执行相同的I/O工作-这将为您节省在I/O请求完成时仍会阻塞的线程。关键字wait
将使对Task.Run
的调用返回后,控制权立即返回调用方法。该调用返回“立即”(它将仅使用当前任务计划程序计划操作,而不是等待操作完成)。任务完成后,await
行后面的代码将继续执行。关键字await
将使对任务的调用返回后,控制权立即返回调用方法。Run
返回。该调用返回“立即”(它将仅使用当前任务计划程序计划操作,而不是等待操作完成)。任务完成后,wait
行后面的代码将继续执行
我的理解是,当调用SomeLongRunningNonAsyncMethod()
时,调用在遇到wait之前不会返回。但是在somelonglunningnonasynchmethod()
中没有等待
您需要区分传递给Task.Run
的委托
和Task.Run的实际执行
前者将在ThreadPool
线程内同步执行。您不需要使用async
关键字,因为您没有等待给定委托中的任何异步操作
当Task.Run
开始执行时,后者将点击其wait
,并将控制权交还给调用方法,直到委托完成执行
那么,这与直接调用SomeLongRunningNonAsyncMethod()相同吗
否。直接调用将在当前运行的线程上同步执行。代码在线程池上同步执行委托
线程,同时线程执行对任务的调用。Run
以非阻塞方式等待任务
完成
您的代码实际上应该是:
await Task.Run(SomeLongRunningNonAsyncMethod);
我的理解是,当调用SomeLongRunningNonAsyncMethod()
时,调用在遇到wait之前不会返回。但是在somelonglunningnonasynchmethod()
中没有等待
您需要区分传递给Task.Run
的委托
和Task.Run的实际执行
前者将在ThreadPool
线程内同步执行。您不需要使用async
关键字,因为您没有等待给定委托中的任何异步操作
当Task.Run
开始执行时,后者将点击其wait
,并将控制权交还给调用方法,直到委托完成执行
那么,这与直接调用SomeLongRunningNonAsyncMethod()相同吗
否。直接调用将在当前运行的线程上同步执行。代码在线程池上同步执行委托
线程,同时线程执行对任务的调用。Run
以非阻塞方式等待任务
完成
您的代码实际上应该是:
await Task.Run(SomeLongRunningNonAsyncMethod);
不,不是。。如果我没弄错的话。。你能详细说明你想要什么吗?你的头衔可能需要改进。“比什么好吗?不,不是。。如果我没弄错的话。。你能详细说明你想要什么吗?你的头衔可能需要改进。“比什么好”吗?