【问题标题】:Task.Factory.StartNew not executing methodTask.Factory.StartNew 不执行方法
【发布时间】:2012-08-20 20:22:48
【问题描述】:

我有一个实体框架方法,它只是将Product 添加到数据库中。当我运行我的测试方法时,这一切都按预期工作。

然后我有一个AddProductAsync 方法:

Task<Product> AddProductAsync(Product pToAdd)
{
    return Task<Product>.Factory.StartNew(() => AddProduct(pToAdd));
}

当我使用这种方法运行测试时,测试运行但实际上没有任何反应。我的AddProduct 方法中的断点永远不会被命中,也不会向数据库中添加任何内容。没有错误,没有警告。

我做错了什么?还是只等EF6?

提前致谢

原始方法:

public static Product AddProduct(Product pToAdd)
    {
        using (var viralDatabase = new ViralWearContext())
        {
            if (viralDatabase.Products.Any(p => p.Name == pToAdd.Name || p.Description == pToAdd.Description))
            {
                var result = viralDatabase.Products.First(p => p.Name == pToAdd.Name || p.Description == pToAdd.Description);
                //set 0 so client knows it already exists
                result.ProductID = 0;
                return result;
            }
            else
            {
                var result = viralDatabase.Products.Add(pToAdd);
                viralDatabase.SaveChanges();
                return result;
            }
        }
    }

单元测试调用的方法:

public async void AddProductsAsyncTest()
    {
        Stopwatch timer = new Stopwatch();

        Product testProduct = GenerateTestProduct();
        Product testProductTwo = GenerateTestProduct();
        Product testProductThree = GenerateTestProduct();
        timer.Start();

        Product_Datalayer.AddProduct(testProduct);
        Product_Datalayer.AddProduct(testProductTwo);
        Product_Datalayer.AddProduct(testProductThree);
        var time1 = timer.ElapsedMilliseconds;
        Console.WriteLine(timer.ElapsedMilliseconds.ToString());

        timer.Reset();

        Product testProductAsync = GenerateTestProduct();
        Product testProductTwoAsync = GenerateTestProduct();
        Product testProductThreeAsync = GenerateTestProduct();
        timer.Start();

        var result1 = Product_Datalayer.AddProductAsync(testProductAsync);
        var result2 = Product_Datalayer.AddProductAsync(testProductTwoAsync);
        var result3 = Product_Datalayer.AddProductAsync(testProductThreeAsync);

        await Task.WhenAll(result1, result2, result3);
        var time2 = timer.ElapsedMilliseconds;
        Console.WriteLine(timer.ElapsedMilliseconds.ToString());
    }

【问题讨论】:

  • 你能发布整个代码,包含 AddProduct 方法和调用上下文吗?
  • 不幸的是我无法测试(我没有.net 4.5),但这可能与等待/任务的问题有关。 WhenAll 是否立即返回?也许这会有所帮助:stackoverflow.com/questions/11950329/…
  • 它不会立即返回。它会在该点挂起几秒钟,然后像完成一样结束调试。

标签: entity-framework async-await


【解决方案1】:

您需要make your unit tests async Task, not async void。请注意,async 单元测试仅受 VS2012 支持。

如果您使用的是 VS2010,则可以使用 Async Unit Tests project described here。我仍然建议您使用async Task,这样它们就可以轻松转换为 VS2012(异步单元测试项目不支持)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多