异步 - 其中哪一个是正确的

时间:2016-11-08 09:53:01

标签: c# .net c#-5.0

从下面的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中等待调用,并且会在上层阻止下一个循环执行。确认

2 个答案:

答案 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是一个标记,表示该行在此方法的同一个线程中执行,它将在线程中等待。
实际上asyncawait是方法返回void的设计。因此,如果此方法不返回结果,则可以单独放入线程中。此方法调用的任何async方法意味着它将使用与void方法相同的线程,如果thoese sub方法需要结果await,则在此线程内等待。
当你将它们放入List<Task>时,它没有任何区别。