async/await在C#中使用时,通常的规则是避免,async void因为这几乎是火,忘记了,Task如果没有从方法发送返回值,则应该使用.说得通.但奇怪的是,在本周早些时候,我正在为async我编写的一些方法编写一些单元测试,并注意到NUnit建议将async测试标记为void或者返回Task.然后我试了一下,果然,它奏效了.这看起来很奇怪,因为nunit框架如何能够运行该方法并等待所有异步操作完成?如果它返回Task,它可以等待任务,然后做它需要做的事情,但是如果它返回void它怎么能把它拉下来呢?
所以我破解了源代码并找到了它.我可以在一个小样本中重现它,但我根本无法理解它们正在做什么.我想我对SynchronizationContext以及它是如何工作的了解不够.这是代码:
class Program
{
static void Main(string[] args)
{
RunVoidAsyncAndWait();
Console.WriteLine("Press any key to continue. . .");
Console.ReadKey(true);
}
private static void RunVoidAsyncAndWait()
{
var previousContext = SynchronizationContext.Current;
var currentContext = new AsyncSynchronizationContext();
SynchronizationContext.SetSynchronizationContext(currentContext);
try
{
var myClass = new MyClass();
var method = myClass.GetType().GetMethod("AsyncMethod");
var result = method.Invoke(myClass, null);
currentContext.WaitForPendingOperationsToComplete();
}
finally
{
SynchronizationContext.SetSynchronizationContext(previousContext);
}
}
}
public class MyClass
{
public async void …Run Code Online (Sandbox Code Playgroud) 我在.NET平台上使用Xunit和NMock.我正在测试一个方法是异步的表示模型.该方法创建一个异步任务并执行它,以便该方法立即返回,我需要检查的状态尚未准备好.
我可以在完成时设置一个标志而不修改SUT但这意味着我必须继续检查while循环中的标志,例如,可能超时.
我有什么选择?