gpt4 book ai didi

c# - 测试此任务的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-30 12:40:55 25 4
gpt4 key购买 nike

我有一个方法可以使用任务和异步/等待来重复工作。

    public static Task ToRepeatingWork(this Action work, int delayInMilliseconds)
{
Action action = async () =>
{
while (true)
{
try
{
work();
}
catch (MyException ex)
{
// Do Nothing
}
await TaskEx.Delay(new TimeSpan(0, 0, 0, 0, delayInMilliseconds));
}
};
return new Task(action, SomeCt, TaskCreationOptions.LongRunning);
}

我写了相应的测试:

    [TestMethod, TestCategory("Unit")]
public async Task Should_do_repeating_work_and_rethrow_exceptions()
{
Action work = () =>
{
throw new Exception("Some other exception.");
};

var task = work.ToRepeatingWork(1);
task.Start();
await task;
}

我预计这个测试会失败,但它通过了(并使测试运行器崩溃)。

但是,如果在 ToRepeatingWork 方法中,我将操作从异步更改为正常操作并使用 Wait 而不是 await,测试将按预期运行。

TaskEx.Delay(new TimeSpan(0, 0, 0, 0, delayInMilliseconds)).Wait();

这里有什么问题吗?

最佳答案

你永远不应该使用任务构造器。如果您有工作要放在线程池上,请使用 Task.Run .这是一个问题,但不是导致崩溃的原因。

你也应该避免 async void , 所以使用 Func<Task>而不是 Action .这就是导致崩溃的原因。

public static Task ToRepeatingWork(this Action work, int delayInMilliseconds)
{
Func<Task> action = async () =>
{
while (true)
{
try
{
work();
}
catch (MyException ex)
{
// Do Nothing
}
await TaskEx.Delay(new TimeSpan(0, 0, 0, 0, delayInMilliseconds));
}
};
return Task.Run(() => action());
}

[TestMethod, TestCategory("Unit")]
public async Task Should_do_repeating_work_and_rethrow_exceptions()
{
Action work = () =>
{
throw new Exception("Some other exception.");
};

var task = work.ToRepeatingWork(1);
await task;
}

关于c# - 测试此任务的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40100508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com