Multithreading 如何从主线程完全终止并行任务?
如何从主线程完全终止此后台线程,即即使是Multithreading 如何从主线程完全终止并行任务?,multithreading,delphi,delphi-10.1-berlin,omnithreadlibrary,Multithreading,Delphi,Delphi 10.1 Berlin,Omnithreadlibrary,如何从主线程完全终止此后台线程,即即使是OnTerminated中的代码也不会执行 uses CodeSiteLogging, OtlParallel, OtlTaskControl, OtlTask; procedure TForm2.btnParallelAsyncClick(Sender: TObject); begin CodeSite.Send('btnParallelAsyncClick 1'); Parallel.Async( procedure(con
OnTerminated
中的代码也不会执行
uses
CodeSiteLogging,
OtlParallel, OtlTaskControl, OtlTask;
procedure TForm2.btnParallelAsyncClick(Sender: TObject);
begin
CodeSite.Send('btnParallelAsyncClick 1');
Parallel.Async(
procedure(const task: IOmniTask)
var
a: Integer;
begin
// executed in background thread:
a := 1 + 1;
Sleep(2000);
CodeSite.Send('Executed in Async Thread', a);
task.Invoke( // used to execute code in main thread
procedure
begin
CodeSite.Send('task.Invoke executed in main thread', a);
end);
Sleep(2000);
CodeSite.Send('Again executed in Async Thread', a);
end,
Parallel.TaskConfig.OnTerminated(
procedure(const task: IOmniTaskControl)
begin
// executed in main thread:
CodeSite.Send('After background thread termination: Executed in Main Thread');
end
)
);
CodeSite.Send('btnParallelAsyncClick 2');
end;
你不能这样做(除了杀死线程,但请不要这样做)
在创建任务之前,添加一个全局标志
shouldSkipTerminate
,将其设置为false
,在终止任务之前将其设置为true
,并检查此标志是否设置在ontterminated
中,这是否是您希望在没有合作的情况下终止任务的问题之一?谢谢,加布里埃尔。我试过这个,但似乎不起作用:这个有效:但这似乎是一个原始的解决方案。是否可以使用类似于任务的东西来主动终止异步
线程。终止
在上面的示例中对我不起作用?@user1580348否。终止
只是向任务发出停止运行的信号,但任务本身需要配合,在收到信号时退出。要帮助加快终止,请使用TEvent.WaitFor而不是Sleep。然后,当您想要终止时,向事件发送信号并检查TWaitResult:If(MyEvent.Waitfor(2000)System.Types.wrTimeout)或Terminated,然后退出;谢谢你的评论,加布里埃尔!顺便问一下,是否可以使用SetPriority
将优先级设置为Parallel.Async
后台任务?