从下面的2个场景中,哪一个是在c#中进行异步编程的正确方法?
方案-1
ORDER BY CAST(CAST(eaov.value AS DECIMAL(3,0)) as UNSIGNED INTEGER), eaov.value
然后
public async Task<T1> AddSomethingAsync(param)
{
return await SomeOtherFunctionFromThirdPartyLibraryForIOAsync(param);
}
方案-2
List<Task> Tasks=new List<Task>();
foreach(var task in FromAllTasks())
{
Tasks.Add(AddSomethingAsync(task));
}
await Task.WhenAll(Tasks.AsParallel());
然后
public async Task<T1> AddSomethingAsync(param)
{
return SomeOtherFunctionFromThirdPartyLibraryForIOAsync(param);
}
2之间的唯一区别是,以后List<Task> Tasks=new List<Task>();
foreach(var task in FromAllTasks())
{
Tasks.Add(SomeOtherFunctionFromThirdPartyLibraryForIOAsync(task));
}
await Task.WhenAll(Tasks.AsParallel());
函数中没有await
个关键字。
所以这里是更新 - 我想要知道的是,所有任务应该并行和异步执行。 (我的想法是在方案-1中,将在AddSomethingAsync中等待调用,并且会在上层阻止下一个循环执行。确认
答案 0 :(得分:6)
情景3
public Task<T1> AddSomethingAsync(param)
{
return SomeOtherFunctionFromThirdPartyLibraryForIOAsync(param);
}
然后
List<Task> Tasks=new List<Task>();
foreach(var task in FromAllTasks())
{
Tasks.Add(SomeOtherFunctionFromThirdPartyLibraryForIOAsync(task));
}
await Task.WhenAll(Tasks);
如果您没有等待任何事情 - 您不需要异步关键字。在这种情况下,执行AsParallel也不会做任何事情。
答案 1 :(得分:-1)
在我看来也一样。 await
是一个标记,表示该行在此方法的同一个线程中执行,它将在线程中等待。
实际上async
和await
是方法返回void的设计。因此,如果此方法不返回结果,则可以单独放入线程中。此方法调用的任何async
方法意味着它将使用与void
方法相同的线程,如果thoese sub方法需要结果await
,则在此线程内等待。
当你将它们放入List<Task>
时,它没有任何区别。