c# - 执行异步/等待时如何确保线程更改?
问题描述
执行await
时Task
可以或不能在同一线程上执行。通常,我们只需要将这一事实纳入设计考虑。但是我想专门针对线程更改场景进行测试-如何确保其余的异步方法(在等待之后)在不同的线程上运行?
可能的解决方案:
[Test]
public void TestForThreadChange()
{
int threadIdBefore, threadIdAfter = 0;
async Task AsyncFunction()
{
Console.WriteLine($"before - {threadIdBefore = Thread.CurrentThread.ManagedThreadId}");
await Task.Yield();
Console.WriteLine($"after - {threadIdAfter = Thread.CurrentThread.ManagedThreadId}");
}
AsyncFunction().Wait();
Assert.That(threadIdBefore, Is.Not.EqualTo(threadIdAfter));
}
解决方案
如何确保其余的异步方法(等待之后)在不同的线程上运行?
首先,确保您已从线程池上下文调用正在测试的方法。一些单元测试框架确实提供了单线程上下文。如果是这种情况,您需要将测试代码包装在await Task.Run(() => ...)
.
然后,模拟正在等待的方法并确保它执行await Task.Yield()
; 这将确保await
在被测方法中将获得不完整的任务,导致它在线程池线程上恢复。
如果您想绝对确定它在不同的线程池线程上恢复,您需要在正在测试的方法上阻止您的单元测试方法,以便当前线程池线程被阻止并且不用于恢复正在运行的方法测试。
推荐阅读
- lua - 我正在尝试制作一个更改文本但无法正常工作的 Roblox GUI
- python - 将 pandas DataFrame 转换为具有连接索引和列值的堆叠字典
- javascript - 更新和导入动态常量
- python - 用遗传算法解决 XOR 的问题
- python - 我们可以从python中的一个类中调用两个函数吗
- arrays - 以值的倍数插入数组,其中值在数组传递之间递增
- java - 错误 java.lang.NoClassDefFoundError: com/mongodb/MongoClient
- json - 如何使用 sqlite json-extract 提取嵌套的 json
- entity-framework - 使用 Entity Framework Core 3.1 在 OnModelCreating 中定义一对多关系
- macos - 在不满足 Apple 要求的情况下启用封闭显示模式