1

我有一个类有一些这样的方法:

private Task Sleep()
{
    return Task.Delay(SleepDuration);
}

public async Task<User> Login(string username, string password)
{
    await Sleep();

    return new User { Id = 1, Username = username };
}

注意,SleepDuration在我的测试中设置为 0。

如果我在 iOS NUnit 项目测试中调用以下内容:

myClass.Login("username", "password").Wait();

测试运行器的 UI 暂停并且永远不会完成。如果我添加断点,代码永远不会到达await. 相同的测试在 .Net 4.5 Mono 项目的标准 NUnit 运行器中运行良好。它在我的应用程序中也可以正常工作,尽管我从不调用Wait并且总是使用 async/await。

有任何想法吗?还有什么我可以用来代替Task.Delay防止死锁的吗?我已经试过Task.Factory.StartNew(() => { })了。

4

1 回答 1

2

现代版本的 NUnitSynchronizationContext为他们的单元测试提供了一个,以便他们可以支持async void单元测试。

Wait当您阻塞异步代码(即, )时,此上下文很可能会导致死锁。我有一篇博文详细描述了交互。请注意,这种死锁仅在Task.Delay返回Task尚未完成的情况下才会发生;对于极短的延迟,在Task到达Wait.

我建议你await在你的单元测试中使用,并制作你的测试方法async Task

于 2013-09-29T20:57:34.730 回答