【问题标题】:how to be sure its parallel in c#如何确保它在 c# 中的并行性
【发布时间】:2015-07-23 20:15:45
【问题描述】:

这是我现在写的代码,我想知道它真的是并行运行的。 这是我的 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)); 
       }     

【问题讨论】:

  • 有两个巨大的功能从两个不同的站点下载图像和上下文。它们是简单的 c# 方法,没有任何 await 和 sync 。我将这两个方法设为 isnatask 和 khabaronlinetask,它们如下所示: public Task> KhabarOnlineTask(List categoryList ) { var ac = new AgenciesClass(); return Task.Run(() => ac.KhabarOnline(categoryList)); }
  • 那么你需要展示这些方法的代码,或者至少你认为让它们并行运行的部分。最好在编辑您的问题时。
  • 这里有一些您可以查看的文档Using an Asynchronous Controller in ASP.NET MVC: msdn.microsoft.com/en-us/library/ee728598(v=vs.100).aspx
  • @mohammaddarbanbaran - 添加代码时,请确保编辑您的帖子并将其添加到那里而不是 cmets - cmets 中的代码不可读。

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


【解决方案1】:

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

await Task.WhenAll 将保证代码只有在两个任务都完成后才能继续。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我认为您切换到 TPL 的建议与 OP 示例中 Task.WhenAll 的使用有些无关...
    • 不建议切换到 TPL。 OP 询问是否要并行运行代码,但有一个异步代码示例。
    猜你喜欢
    • 2020-08-19
    • 2018-02-26
    • 2012-02-06
    • 2017-10-01
    • 2019-08-15
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多