C# 为什么这个任务挂起?
上面例子中的任务永远等待的原因是什么?我应该如何C# 为什么这个任务挂起?,c#,task,C#,Task,上面例子中的任务永远等待的原因是什么?我应该如何等待()以使任务不挂起?您没有启动任务。试试这个: [TestMethod] public void Y() { int i = 0; new Task(() => i++).Wait(); Assert.AreEqual(1, i); } 或者更好(如Damien所建议)使用: 通常有3个原因导致someTask.Wait挂起: 您已将捕获的同步上下文锁定 根本没有同步上下文 您正在等待一项从未开始的任务 在第一
等待()
以使任务不挂起?您没有启动任务。试试这个:
[TestMethod]
public void Y()
{
int i = 0;
new Task(() => i++).Wait();
Assert.AreEqual(1, i);
}
或者更好(如Damien所建议)使用:
通常有3个原因导致someTask.Wait
挂起:
您已将捕获的同步上下文锁定
根本没有同步上下文
您正在等待一项从未开始的任务
在第一个示例中,windows窗体应用程序可能是一个场景,但[TestMethod]
属性说明了不同的情况。不过,您可以使用.ConfigureAwait(false)
摆脱这一困境,但在开始这一过程之前,请先阅读相关内容async/await
在表面上看起来很简单,但你正在踏入雷区
在单元测试项目中,您需要一个测试运行程序来处理发布到同步上下文的消息。如果您使用的测试运行程序不是这样,那么这可能是一个问题
但是,在您当前的方法中,您并没有启动任务。从未开始的任务永远不会完成
但是,如果您开始执行任务,您可能会以上面的第2点结束
结论:确保你开始了你的任务,如果这仍然阻碍了你,那么看看你正在使用的单元测试框架
要启动任务,请执行以下操作:
[TestMethod]
public void Y()
{
int i = 0;
Task.Run(() => i++).Wait();
Assert.AreEqual(1, i);
}
另外,一般来说,除非您围绕处理任务构建某种框架,否则您可能根本不应该使用新任务(…)
,而是选择任务。运行:
var task = new Task(() => i++);
task.Start();
task.Wait();
如果您的测试运行程序正确支持async/Wait,我宁愿将整个方法重写为async:
Task.Run(() => i++).Wait();
您的测试框架支持异步测试吗?如果是这样的话,您可能应该重新处理此任务,使其始终保持异步,并删除显式的等待
。任务永远不会启动。或者更好的做法是,养成使用任务的习惯。运行
来创建热任务。
Task.Run(() => i++).Wait();
[TestMethod]
public async Task Y()
{
int i = 0;
await new Task(() => i++);
Assert.AreEqual(1, i);
}