C#任务.Cancel占用了大量内存,它与线程中的.Artrt不同

本文关键字:线程 不同 Artrt 内存 Cancel 任务 | 更新日期: 2023-09-27 18:25:21

我在任务中对.Cancel.Wait有问题。这需要大量的记忆和时间。

任务:

using (CancellationTokenSource cancelSource = new CancellationTokenSource())
{
    CancelEventArgs args = new CancelEventArgs(false);
    Task task = Task.Factory.StartNew(() =>
    {
        try
        {
            action(args);
        }
        catch (Exception ex)
        {
            exception = ex;
        }
    }, cancelSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Current);
    bool success = task.Wait(maxRuntime);
    if (!success)
    {
        cancelSource.Cancel();
        return false;
    }
}

在C#线程中,我使用.Abort中止线程。在任务中,我使用.Cancel.,但我认为.Cancel占用大量内存和时间,与线程中的.Abort不同。使用时如何减少内存

bool success = task.Wait(maxRuntime);
if (!success)
{
    cancelSource.Cancel();
    return false;
}

线程示例:

Thread workerThread = new Thread(threadStart);
workerThread.Start();
bool finished = workerThread.Join(timeout);
if (!finished)
    workerThread.Abort();
return finished;

C#任务.Cancel占用了大量内存,它与线程中的.Artrt不同

取消任务与中止线程有根本不同。

中止线程将在中止的线程中引发ThreadAbortException。因此,即使在线程内执行的代码不知道这种机制,它也会被中止。

另一方面,取消任务不会引发任何异常。相反,该任务需要检查CancellationToken.IsCancellationRequested是否为true,然后主动抛出OperationCanceledException异常。这意味着,如果任务执行的代码没有检查IsCancellationRequested,则任务将不会响应取消请求
有关详细信息,请参阅此MSDN页面。