3

我很难理解 IDSYNC 和 IDNOTIFY 之间的真正区别,就我编写的代码行而言,同步/异步意味着什么?

procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
begin
    ....
    DoSomeThing (TIDNotify)    ....

    DoSomethingOther(TIDsync) ......

 end; 

为什么我不能确定这两行代码都在 TCPServer Execute 函数中执行?是否只有几行代码没有在我的 TIDSynfunction 中执行的风险,或者如何解释死锁?

4

1 回答 1

10

TIdSync 和 TIdNotify 实现了相同的目标——在主线程的上下文中执行一段代码——但它们以不同的方式完成。

TIdSync是同步的。该TIdSync.Synchronize()方法阻塞调用线程,直到主线程调用该TIdSync.DoSynchronize()方法并退出。TIdSync.Synchronize()如果在主线程关闭服务器时在服务器事件处理程序中调用,可能会发生死锁。这是因为主线程被阻塞等待服务器终止其线程。但是线程被阻塞等待主线程处理同步请求。

TIdNotify是异步的。该方法将该TIdNotify.Notify()方法添加TIdNotify.DoNotify()到后台队列中并立即退出,因此调用线程不会被阻塞。主线程TIdNotify.DoNotify()在空闲时调用该方法。在这种情况下没有僵局。

于 2012-11-23T23:34:01.823 回答