Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试永远与任务一起运行_C#_Unit Testing - Fatal编程技术网

C# 单元测试永远与任务一起运行

C# 单元测试永远与任务一起运行,c#,unit-testing,C#,Unit Testing,我有一个永远运行的单元测试: [Test] public bool test() { manager.Send(10); Thread.Sleep(1000); manager.Messages.Should().HaveCount(10); return true; } manager.Send()方法是: private void Send() { try { var entities = GetAllEntities(

我有一个永远运行的单元测试:

[Test]
public bool test()
{
    manager.Send(10);

    Thread.Sleep(1000);

    manager.Messages.Should().HaveCount(10);

    return true;
}
manager.Send()方法是:

private void Send()
{
    try
    {
        var entities = GetAllEntities();

        foreach (var group in entities.GroupBy(r => r.Priority))
        {
            var tasks = group.Select(entity => Task.Factory.StartNew(() => manager.SendEntity(entity))).ToList();
            Task.WaitAll(tasks.ToArray());

            if (tasks.All(r => r.Result.Result == true))
            {
                // some code here...
            }
        }
    }
    catch (Exception e)
    {
        logger.FatalException(e.Message, e);
    }
    finally
    {
        logger.Info("End...");
    }
}
和SendEntity()方法:


调试器在这一行停止并永远休眠。我做错了什么?我将单元测试方法的返回值添加到bool(异步方法不会在void方法中抛出异常)。但这没用。你有什么建议吗?

你在那里遇到了僵局。 首先,您不必使用

Task.Factory.StartNew(() => manager.SendEntity(entity)
似乎
SendToServer
已经是异步的

使用
Task.Wait***/Task.Result
,使用异步流也是一种不好的做法

private async Task Send()
{
    try
    {
        var entities = GetAllEntities();

        foreach (var group in entities.GroupBy(r => r.Priority))
        {
            var tasks = group
                .Select(entity => manager.SendEntity(entity))
                .ToArray();

            var results = await Task.WhenAll(tasks);
            if (results.All(result => result))
            {
                // some code here...
            }
        }
    }
    catch (Exception e)
    {
        logger.FatalException(e.Message, e);
    }
    finally
    {
        logger.Info("End...");
    }
}
但是如果不想重写Send方法,可以使用
.ConfigureAwait(false)


但是无论如何,请删除
开始新的
-您不需要它。

非常感谢!真管用!我删除了StartNew并使用了Task。我还注意到使用
Task.Factory.StartNew
而不是
Task.Run
(受stephen cleary启发:)是不好的(tm)和邪恶的(tm)
Task.Factory.StartNew(() => manager.SendEntity(entity)
private async Task Send()
{
    try
    {
        var entities = GetAllEntities();

        foreach (var group in entities.GroupBy(r => r.Priority))
        {
            var tasks = group
                .Select(entity => manager.SendEntity(entity))
                .ToArray();

            var results = await Task.WhenAll(tasks);
            if (results.All(result => result))
            {
                // some code here...
            }
        }
    }
    catch (Exception e)
    {
        logger.FatalException(e.Message, e);
    }
    finally
    {
        logger.Info("End...");
    }
}
return taskCompletionSource.Task.ConfigureAwait(false);