如果在没有完成任务的情况下超时,Task.Wait(int)是否会停止任务?

Pau*_*oza 31 .net c# multithreading task task-parallel-library

我有一个任务,我希望它能在一秒钟内运行,但是如果需要的时间超过几秒钟,我想取消任务.

例如:

Task t = new Task(() =>
        {
            while (true)
            {
                Thread.Sleep(500);
            }
        });
t.Start();
t.Wait(3000);
Run Code Online (Sandbox Code Playgroud)

请注意,等待3000毫秒后,等待到期.超时到期或任务是否仍在运行时,任务是否被取消?

Nic*_*nko 52

Task.Wait()等待直至任务完成指定的时间和返回任务是否在指定的时间(或更早)或不量完成.任务本身不会被修改,也不依赖于等待.

阅读精彩系列:.NET中的并行性,.NET中的并行性 - 第10部分,PLEDQ中的取消和 Reed Copsey 的Parallel类

并且:.NET 4取消框架/ 并行编程:任务取消

检查以下代码:

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();
Run Code Online (Sandbox Code Playgroud)


Bri*_*sen 16

如果要取消a Task,则应在CancellationToken创建任务时传入.这将允许您Task从外部取消.如果需要,您可以将取消绑定到计时器.

要使用Cancellation标记创建任务,请参阅以下示例:

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);
Run Code Online (Sandbox Code Playgroud)

要取消Task呼叫Cancel()tokenSource.

  • 这不允许你只从外面请求*取消吗?代表是否注意基于令牌的请求并实际抛出或只是继续工作而不取消是不是由代表决定? (3认同)

小智 7

任务仍在运行,直到您明确告诉它停止或循环结束(这将永远不会发生).

您可以检查Wait的返回值以查看:

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

类型:System.Boolean如果任务在指定的时间内完成执行,则为true;否则为false.否则,错误.


Ric*_*ard 6

超时到期或任务是否仍在运行时,任务是否被取消?

不,是的.

传递给的超时Task.Wait是针对的Wait,而不是任务.