Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个任务挂起?_C#_Task - Fatal编程技术网

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