Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Task.Run(NonAsyncMethod())等待是否更好?_C#_.net_Task Parallel Library_Async Await - Fatal编程技术网

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

不,不是。。如果我没弄错的话。。你能详细说明你想要什么吗?你的头衔可能需要改进。“比什么好吗?不,不是。。如果我没弄错的话。。你能详细说明你想要什么吗?你的头衔可能需要改进。“比什么好”吗?