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;
取消任务与中止线程有根本不同。
中止线程将在中止的线程中引发ThreadAbortException
。因此,即使在线程内执行的代码不知道这种机制,它也会被中止。
另一方面,取消任务不会引发任何异常。相反,该任务需要检查CancellationToken.IsCancellationRequested
是否为true
,然后主动抛出OperationCanceledException
异常。这意味着,如果任务执行的代码没有检查IsCancellationRequested
,则任务将不会响应取消请求
有关详细信息,请参阅此MSDN页面。