C#奇怪的执行顺序

时间:2014-12-28 10:37:17

标签: c#

请帮我理解这一点。我有这段代码:

if (Entries == null)
{
    ExecuteAsync(Report);                
}

if (Entries == null)
{
    RaisError("No entries!");
    return;
}

我的问题是执行从第一个if开始,发现它是真的,执行代码块并退出,条目仍然等于null,因此执行第二个代码块。这些是ExecuteAsync和Report方法:

public async void ExecuteAsync(Action executeAction, Action callbackAction = null)
{
    try
    {
        await Task.Run(executeAction);

        if (callbackAction != null)
            await Task.Run(callbackAction);
    }
    catch (Exception exception)
    {
        ModernDialog.ShowMessage(exception.Message, "Error", MessageBoxButtonOk);
    }
}


private void Report()
{
    Entries = DataAccessLayer.BrandReport(SelectedBrand, SelectedModel, FromDate, ToDate).ToList();

    TotalAmount = Entries.Sum(a => a.Amount);
    TotalQuantity = Entries.Sum(q => q.Quantity);
}

虽然我正在调用.ToList,但我仍然在条目中获取null !!!!

1 个答案:

答案 0 :(得分:1)

好吧,您正在异步执行Report,然后您在没有对Task返回的ExecuteAsync执行任何操作的情况下向前跳到第二个if块。按理说,在if被评估并分配给DataAccessLayer.Brand...之前,您的第二个Entries可能会被点击。

如果您想在评估第二个Report之前等待Entries == null完成,请同步调用它(即没有ExecuteAsync),或使用Wait方法在Task返回的ExecuteAsync上。