代码之家  ›  专栏  ›  技术社区  ›  Paul Mendoza

Task.Wait(int)是否在任务未完成时超时而停止任务?

  •  29
  • Paul Mendoza  · 技术社区  · 14 年前

    例如:

    Task t = new Task(() =>
            {
                while (true)
                {
                    Thread.Sleep(500);
                }
            });
    t.Start();
    t.Wait(3000);
    

    请注意,3000毫秒后等待将过期。超时时任务是否已取消,或者任务仍在运行?

    4 回复  |  直到 12 年前
        1
  •  16
  •   Brian Rasmussen    14 年前

    如果你想取消 Task CancellationToken 创建任务时。你可以取消 任务

    要使用取消标记创建任务,请参见以下示例:

    var tokenSource = new CancellationTokenSource();
    var token = tokenSource.Token;
    
    var t = Task.Factory.StartNew(() => {
        // do some work
        if (token.IsCancellationRequested) {
            // Clean up as needed here ....
        }
        token.ThrowIfCancellationRequested();
    }, token);
    

    取消 任务 Cancel() tokenSource .

        2
  •  54
  •   Noctis    10 年前

    Task.Wait() 高达

    阅读尼斯系列: Parallelism in .NET Parallelism in .NET – Part 10, Cancellation in PLINQ and the Parallel class 里德·科西

    以及: .NET 4 Cancellation Framework / Parallel Programming: Task Cancellation

    检查以下代码:

    var cts = new CancellationTokenSource();
    
    var newTask = Task.Factory.StartNew(state =>
                               {
                                  var token = (CancellationToken)state;
                                  while (!token.IsCancellationRequested)
                                  {
                                  }
                                  token.ThrowIfCancellationRequested();
                               }, cts.Token, cts.Token);
    
    
    if (!newTask.Wait(3000, cts.Token)) cts.Cancel();
    
        3
  •  7
  •   justinmvieira    14 年前

    在明确告诉任务停止或循环完成(这永远不会发生)之前,任务仍在运行。

    (来自 http://msdn.microsoft.com/en-us/library/dd235606.aspx ) 返回值

    类型:System.Boolean 如果任务在分配的时间内完成执行,则为true;否则为false。

        4
  •  6
  •   Richard    14 年前

    超时时任务是否已取消,或者任务仍在运行?

    不,是的。

    Task.Wait 是为了 Wait ,而不是任务。

        5
  •  0
  •   Florian Winter    5 年前

    如果任务调用任何同步方法来执行任何类型的I/O或其他需要时间的未指定操作,则没有“取消”它的通用方法。

    根据您尝试“取消”它的方式,可能会发生以下情况之一:

    • 操作实际上被取消,并且它所处理的资源处于不一致的状态(以后可能会导致各种问题)
    • 该操作将继续,并可能干扰其他代码正在执行的任何操作(以后可能会导致各种问题)
    • 操作失败或导致进程崩溃。

    在一些有效的场景中,您可以而且可能应该使用其他答案中描述的一种通用方法来取消任务。但是如果您在这里是因为您想中断一个特定的同步方法,那么最好查看该方法的文档,以确定是否有方法中断它,它是否有“timeout”参数,或者它是否有可中断的变体。