如何确保它在c#中的并行

时间:2015-07-23 20:15:46

标签: c# asp.net-mvc parallel-processing task

这是我现在写的代码,我想知道它是否真的并行运行。 这是我的mvc代码中控制器的一部分。

namespace NewsReader.Controllers
{
    public class TestController : Controller
    {
        public async Task<ActionResult> Index()
        {
            using (var db = new ApplicationDbContext())
            {
                var categoryList = db.Categories.Select(item => item.Name).ToList();
                var khabaronline = KhabarOnlineTask(categoryList);
                var isna = IsnaTask(categoryList);
                await Task.WhenAll(khabaronline, isna);
                var newsList = new List<NewsDetail>();
                newsList.AddRange(khabaronline.Result);
                newsList.AddRange(isna.Result);
                return View(newsList);
            }
       }

       public Task<List<NewsDetail>> KhabarOnlineTask(List<string> categoryList) 
       { 
          var ac = new AgenciesClass(); 
          return Task.Run(() => ac.KhabarOnline(categoryList)); 
       }     

2 个答案:

答案 0 :(得分:1)

假设两个任务看起来类似,代码确实会尝试并行运行,因为同步启动Task.Run(()...的2个任务。由于实现/显式同步中的错误,它们可能最终会相互序列化,但至少start会并行。

await Task.WhenAll将保证代码仅在两个任务完成后继续。

注意:始终使用async / await或只是较低级别的Run / ContinueWith的代码会更容易阅读/推理,但混合你的方式也很好。

答案 1 :(得分:0)

您正在询问并行编程但显示异步方法。尽管它们在想法上相似但它们有几个不同之处。如果您尝试并行运行代码,请查看TPL(任务并行库)。否则就像在你的例子中一样,你的代码将异步运行,并且只会在需要时生成一个新线程。

List<string> collection = GetSomeCollection();
Parallel.ForEach(collection, item =>
{
    //run in parallel
});