我正在尝试编写一个控制台应用程序(C#.NET),它利用第三方DLL中的非托管代码。
外部程序集广泛使用回调。我使用的示例应用程序使用Windows窗体。
示例代码(Windows窗体)使用ThreadPool.QueueUserWorkItem
ThreadPool.QueueUserWorkItem(new WaitCallback(ConnectToControlPanel));
似乎在Windows窗体中有一个消息泵来处理回调。这不是控制台应用程序的情况,所以我需要构建自己的。
我尝试过添加重置事件
private static ManualResetEvent resetEvent = new ManualResetEvent(false);
static void main()
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ConnectToControlPanel));
resetEvent.WaitOne();
}
private void ConnectToControlPanel()
{
//Call external function from unmanaged DLL
resetEvent.Set();
}
这不起作用。
我的问题似乎非常like this one但除了使用Win.Forms并调用Application.DoEvents()
之外没有其他真正的解决方案。修改
我修改了我的代码:
Task task = Task.Factory.StartNew(() => ConnectToControlPanel());
while (task.Status != TaskStatus.RanToCompletion)
{
Application.DoEvents();
Thread.Sleep(500);
}
这样可行,回调会在进度时被调用,结果是成功而不是超时。
每次拨打外部电话时都不得不运行那个丑陋的循环。
我也试过启动另一个不断调用Application.DoEvents()
的线程,但这不起作用,所以我假设它与在调用该调用的同一个线程中运行有关。