微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个方法,它使用任务和async / await重复工作.

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,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方法中,我将操作从异步更改为正常操作并使用等待而不是等待,则测试将按预期运行.

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

这有什么不对?

解决方法

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

您还应该避免异步void,因此请使用Func< Task>而不是行动.这就是导致崩溃的原因.

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,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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐