C# 我意识到并行。调用等待任务。运行,有缺点还是不同? public static async void Start\u myMethod1\u asyncron() { 等待任务。运行(()=>{ myMethod1(); }); } 公共静态异步void Start\u myMethod2\u asyncron() { 等待任务。运行(()=>{ myMethod2(); }); } 公共静态void Main(字符串[]args) { 启动_myMethod1_asyncron(); 启动_myMethod2_asyncron(); //区别? Parallel.Invoke(myMethod1、myMethod2); } 执行Start\u myMethod1\u asyncron()和Start\u myMethod2\u asyncron()与Parallel相同的操作。调用(myMethod1,myMethod2) 我可以使用asyncron()方法来实现并行性吗

C# 我意识到并行。调用等待任务。运行,有缺点还是不同? public static async void Start\u myMethod1\u asyncron() { 等待任务。运行(()=>{ myMethod1(); }); } 公共静态异步void Start\u myMethod2\u asyncron() { 等待任务。运行(()=>{ myMethod2(); }); } 公共静态void Main(字符串[]args) { 启动_myMethod1_asyncron(); 启动_myMethod2_asyncron(); //区别? Parallel.Invoke(myMethod1、myMethod2); } 执行Start\u myMethod1\u asyncron()和Start\u myMethod2\u asyncron()与Parallel相同的操作。调用(myMethod1,myMethod2) 我可以使用asyncron()方法来实现并行性吗,c#,async-await,task,task-parallel-library,C#,Async Await,Task,Task Parallel Library,一个显著的区别是,并行。调用和其他“并行”方法阻塞,直到工作完成。而async void是fire and forget,并且async Task返回需要以某种方式处理的任务 您的示例可能会返回一个任务,并使用task.WhenAll(myTask1,myTask2).Result使其等效。然而,任务和异步方法被假定为异步的,并且可能需要在完成之前在主线程上完成工作。如果在主线程上使用.result,则可能会导致死锁,因此建议使用 Invoke应该与常规的同步方法一起工作,所以死锁的风险应该更小

一个显著的区别是,
并行。调用
和其他“并行”方法阻塞,直到工作完成。而
async void
是fire and forget,并且
async Task
返回需要以某种方式处理的任务

您的示例可能会返回一个任务,并使用
task.WhenAll(myTask1,myTask2).Result
使其等效。然而,任务和异步方法被假定为异步的,并且可能需要在完成之前在主线程上完成工作。如果在主线程上使用
.result
,则可能会导致死锁,因此建议使用

Invoke应该与常规的同步方法一起工作,所以死锁的风险应该更小。我知道,在调度方面也可能存在一些差异。For/Foreach有一些逻辑来限制并行性,以限制使用的线程数。我不确定
.Invoke
是否也有相同的功能,或者与常规任务调度相比,它到底有什么区别


在我看来,在运行计算量大、数据并行的工作时,请使用Parallel for/foreach。在执行IO密集型工作时使用Tasks/async,或者避免阻塞UI线程。我想,对于任务并行工作,您可以使用Task/async或parallel.Invoke,我个人可能更喜欢任务。

一个显著的区别是
parallel.Invoke
和其他“并行”方法会阻塞,直到工作完成。而
async void
是fire and forget,并且
async Task
返回需要以某种方式处理的任务

您的示例可能会返回一个任务,并使用
task.WhenAll(myTask1,myTask2).Result
使其等效。然而,任务和异步方法被假定为异步的,并且可能需要在完成之前在主线程上完成工作。如果在主线程上使用
.result
,则可能会导致死锁,因此建议使用

Invoke应该与常规的同步方法一起工作,所以死锁的风险应该更小。我知道,在调度方面也可能存在一些差异。For/Foreach有一些逻辑来限制并行性,以限制使用的线程数。我不确定
.Invoke
是否也有相同的功能,或者与常规任务调度相比,它到底有什么区别


在我看来,在运行计算量大、数据并行的工作时,请使用Parallel for/foreach。在执行IO密集型工作时使用Tasks/async,或者避免阻塞UI线程。我想对于任务并行工作,您可以使用Task/async或parallel.Invoke,我个人可能更喜欢任务。

Task.Run
基本上是
parallel.Invoke的更现代版本。Tl;Dr通常总是使用
任务
抽象,让它为您处理线程。在2021年,使用任何
并行
库都没有多大意义,因为它们“做同样的事情”。是的,不是。引擎盖下有多种不同。但是结果是相似的。为什么要使用
异步void
?请选择
异步任务
而不是
异步无效
,除非它们是事件处理程序。
Task.Run
基本上是
Parallel.Invoke的更现代版本。Tl;Dr通常总是使用
任务
抽象,让它为您处理线程。在2021年,使用任何
并行
库都没有多大意义,因为它们“做同样的事情”。是的,不是。引擎盖下有多种不同。但是结果是相似的。为什么要使用
异步void
?请选择
异步任务
而不是
异步无效
,除非它们是事件处理程序。