代码之家  ›  专栏  ›  技术社区  ›  Pரதீப்

如何检查C代码中死锁的可能性

  •  4
  • Pரதீப்  · 技术社区  · 7 年前

    我的应用程序有时会在下面的代码中停止,不总是,但有时会停止。

    所有3种方法 CalcQuarterlyFigures , CalcWeeklyFigures 和; CalcMonthlyFigures 返回 Task<List<MyClass>> .

    注意,这在 foreach 循环。

    List<Task> TaskList = new List<Task>();
    
    if(i.DoCalculateAllHistory) {
    
        var quarterly = CalcQuarterlyFigures(QuarterlyPrices, i.SeriesID);
        TaskList.Add(quarterly);
        var weekly = CalcWeeklyFigures(WeeklyPrices, i.SeriesID);
        TaskList.Add(weekly);
        var monthly = CalcMonthlyFigures(MonthlyPrice, i.SeriesID);
        TaskList.Add(monthly);
    
        Task.WaitAll(TaskList.ToArray());
    
        if(monthly.Result.Count > 0)
            monthlyPerfFig.AddRange(monthly.Result);
    
        if(weekly.Result.Count > 0)
            weeklyPerfFig.AddRange(weekly.Result);
    
        if(quarterly.Result.Count > 0)
            quartPerfFig.AddRange(quarterly.Result);
    } else {
    
        monthlyPerfFig.AddRange(await CalcMonthlyFigures(MonthlyPrice, i.SeriesID));
    
    }
    

    我是不是错过了什么导致锁死的东西?

    1 回复  |  直到 7 年前
        1
  •  7
  •   Fabio    7 年前

    在提供的上下文中(.NET 4.6.1的示例代码) Task.WaitAll(TaskList.ToArray()) 会导致死锁。
    绝对有用的来源: Don't Block on Async Code

    您应该使代码块完全异步

    if (i.DoCalculateAllHistory) 
    {
        var quarterlyTask = CalcQuarterlyFigures(QuarterlyPrices, i.SeriesID);
        var weeklyTask = CalcWeeklyFigures(WeeklyPrices, i.SeriesID);
        var monthlyTask = CalcMonthlyFigures(MonthlyPrice, i.SeriesID);
    
        // Task.WhenAll accepts "params" array
        await Task.WhenAll(quarterlyTask, weeklyTask, monthlyTask);
    
        // You don't need to check for .Count
        // nothing will be added when empty list given to .AddRange  
        quartPerfFig.AddRange(await quarterlyTask);
        weeklyPerfFig.AddRange(await weeklyTask);
        monthlyPerfFig.AddRange(await monthlyTask);
    } 
    else 
    {
        var monthly = await CalcMonthlyFigures(MonthlyPrice, i.SeriesID);
        monthlyPerfFig.AddRange(monthly);
    }