我有一个应用程序需要使用供应商提供的 API 来在呼叫路由到用户的分机时执行屏幕弹出。另一位开发人员致力于让 API 正常工作,并提供了一个不太正确的原型包装类,我正在努力让它正确。
因为这个 API 在返回之前可能会阻塞几分钟,所以开发者在一个单独的线程中启动了 API 接口代码,如下所示:
// constructor
public ScreenPop( ...params... )
{
...
t = new Thread( StartInBackground );
t.Start();
)
private void StartInBackground()
{
_listener = new ScreenPopTelephoneListener();
_bAllocated = true;
_listener.Initialize( _address );
_bInitialized = true;
_listener.StartListening( _extension );
_bListening = true;
}
如果电话服务器无响应,则对 Initialize 的调用可能会挂起。
我不认为这样做的开发人员是故意的,但是当 API 以这种方式初始化时,线程会继续运行,所以现在我必须先停止线程,然后才能在我想要清理的时候进行清理. 我还必须使用 Invoke 从线程中获取事件,正如其他人在我之前的问题中如此友好地指出的那样,但现在正在工作。
无论如何,这里是用来关闭一切和清理的逻辑:
public void ShutdownFunc()
{
try
{
if ( _bListening )
{
_listener.StopListening();
_bListening = false;
}
if ( _bInitialized )
{
_listener.Shutdown();
_bInitialized = false;
}
if ( _bAllocated )
{
_listener = null;
_bAllocated = false;
}
}
}
当然,整个混乱中有一个 try/catch 来防止未处理的异常。
我最大的问题是,当 API 接口代码在单独的线程中运行时,如何调用关闭代码?我需要清理以防用户注销然后重新登录,因为如果我不这样做,API 就会混淆。Thread.Abort 不起作用,因为它无法捕获异常,并且“volatile bool”方法也不起作用,原因很明显(大多数时候,API 线程不活动)。
因此,如果 API 接口代码在单独的线程上运行,似乎没有办法调用关闭逻辑。Thread.Abort() 绕过所有逻辑并在不清理的情况下杀死线程。调用 Shutdown 方法时,从 GUI 线程调用关闭逻辑会挂起。那么,我能做些什么呢?
IDispose 接口只是在 GUI 线程中增加了另一层抽象,并没有解决这里的问题。
现在,为了开发其余的代码,我将完全消除线程。但是,在我发布应用程序之前,我需要弄清楚这一点。
有人吗?
谢谢,
戴夫