C# 带有消息泵的控制台应用程序

C# 带有消息泵的控制台应用程序,c#,.net,loops,message,C#,.net,Loops,Message,我正在尝试编写一个控制台应用程序(C#.NET),它使用第三方DLL中的非托管代码 外部程序集广泛使用回调。我的示例应用程序使用Windows窗体 示例代码(Windows窗体)使用ThreadPool.QueueUserWorkItem ThreadPool.QueueUserWorkItem(new WaitCallback(ConnectToControlPanel)); windows窗体似乎有一个消息泵来处理回调。控制台应用程序并非如此,因此我需要构建自己的应用程序 我已尝试添加重置

我正在尝试编写一个控制台应用程序(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();
}
那不行

我的问题似乎很严重,但除了使用Win.Forms和调用Application.DoEvents()之外,没有其他真正的解决方案

编辑

我修改了我的代码,因此:

Task task = Task.Factory.StartNew(() => ConnectToControlPanel());
            while (task.Status != TaskStatus.RanToCompletion)
            {
                Application.DoEvents();
                Thread.Sleep(500);
            }
这是可行的,回调在进程中被调用,结果是成功的,而不是超时

但每次我打外部电话时都要运行那个丑陋的循环,这感觉是不对的


我还尝试了另一个线程,该线程不断调用
Application.DoEvents()
,但不起作用,因此我假设这与在调用的同一线程中运行有关。

能否请您添加有关哪些不起作用的详细信息?如果有任何错误,请也包括在内。我认为消息泵(UI概念)和QueueUserWorkItem(线程概念)没有直接关系。在Wndows.Forms版本中,
ConnectToControlPanel
方法调用外部DLL的
ConnectPanel
方法。然后,表单应用程序会定期接收进度回调,直到建立连接(在本例中为TCP),并且
ConnectPanel
调用返回结果。在我的控制台应用程序中,调用最终超时,并且没有收到任何回调方法。听起来您的非托管代码需要处理消息循环。您是否尝试过在没有表单的Windows窗体应用程序中运行此代码?如果需要,您可以随时手动分配控制台。Sergey看起来就是这样,是的,如果我运行传统的Win Forms应用程序,一切都会正常工作。不过,我确实在运行时显示了一个丑陋的空白表单,最终这个控制台应用程序需要在Mono上运行,而Mono上没有GUI可言。@GavinHill,刚刚看到您对原始问题的更新。您是否尝试过在不创建表单的情况下调用
Application.Run()
,而不是调用
Application.DoEvents()