如何取消并发的繁重任务?
How do I cancel a concurrent heavy Task?
我有一个 Task,在 body 中运行繁重的进程。此外,我们无法访问此方法(重进程)的body,我们必须等到完成该进程。
现在我的问题是,如何在不中断任务的情况下取消任务,这样我就不会检查其中的任何值?
我的代码是这样的:
private CancellationTokenSource CTS = new CancellationTokenSource();
public void CallMyMethod(CancellationTokenSource cts)
{
//
// Several methods they call each other. And pass tokens to each other.
MyProcess(cts);
}
private void MyProcess(CancellationTokenSource cts)
{
CancellationToken token = cts.Token;
Task.Run(() =>
{
token.ThrowIfCancellationRequested(); // Work just when ThrowIfCancellationRequested called. and check that again
if (token.IsCancellationRequested) // Must be checked every time, and after the investigation not work.
return;
// My long time process
HeavyProcess(); // We have no access to the body of this method
}, token);
}
private void CancelProcess()
{
try
{
//
// I want to cancel Now, Just Now not after HeavyProcess completion or checking token again!
//
CTS.Cancel();
CTS.Token.ThrowIfCancellationRequested();
}
catch
{ }
}
之后我可以取消繁重的过程吗运行?
如果你不能控制长运行方法,那么合作取消是行不通的。您可以做的是将繁重的工作卸载到另一个 进程 ,并在后台线程中监视该进程:
private void MyProcess(CancellationTokenSource cts)
{
cts.Token.ThrowIfCancellationRequested();
// Move the heavy work to a different process
var process = Process.Start(new ProcessStartInfo { /* */ });
// Register to the cancellation, where if the process is still
// running, kill it.
cts.Token.Register(() =>
{
if (!process.HasExited)
{
process.Kill();
}
});
}
现在,当您取消时,您会调用我们终止流程的回调:
private void CancelProcess()
{
CTS.Cancel();
}
我有一个 Task,在 body 中运行繁重的进程。此外,我们无法访问此方法(重进程)的body,我们必须等到完成该进程。
现在我的问题是,如何在不中断任务的情况下取消任务,这样我就不会检查其中的任何值?
我的代码是这样的:
private CancellationTokenSource CTS = new CancellationTokenSource();
public void CallMyMethod(CancellationTokenSource cts)
{
//
// Several methods they call each other. And pass tokens to each other.
MyProcess(cts);
}
private void MyProcess(CancellationTokenSource cts)
{
CancellationToken token = cts.Token;
Task.Run(() =>
{
token.ThrowIfCancellationRequested(); // Work just when ThrowIfCancellationRequested called. and check that again
if (token.IsCancellationRequested) // Must be checked every time, and after the investigation not work.
return;
// My long time process
HeavyProcess(); // We have no access to the body of this method
}, token);
}
private void CancelProcess()
{
try
{
//
// I want to cancel Now, Just Now not after HeavyProcess completion or checking token again!
//
CTS.Cancel();
CTS.Token.ThrowIfCancellationRequested();
}
catch
{ }
}
之后我可以取消繁重的过程吗运行?
如果你不能控制长运行方法,那么合作取消是行不通的。您可以做的是将繁重的工作卸载到另一个 进程 ,并在后台线程中监视该进程:
private void MyProcess(CancellationTokenSource cts)
{
cts.Token.ThrowIfCancellationRequested();
// Move the heavy work to a different process
var process = Process.Start(new ProcessStartInfo { /* */ });
// Register to the cancellation, where if the process is still
// running, kill it.
cts.Token.Register(() =>
{
if (!process.HasExited)
{
process.Kill();
}
});
}
现在,当您取消时,您会调用我们终止流程的回调:
private void CancelProcess()
{
CTS.Cancel();
}