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

Gav*_*ill 5 .net c# message loops

我正在尝试编写一个控制台应用程序(C# .NET),它使用第 3 方 DLL 中的非托管代码。

外部程序集大量使用回调。我的示例应用程序使用 Windows 窗体。

示例代码(Windows 窗体)使用 ThreadPool.QueueUserWorkItem

ThreadPool.QueueUserWorkItem(new WaitCallback(ConnectToControlPanel));
Run Code Online (Sandbox Code Playgroud)

看起来 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();
}
Run Code Online (Sandbox Code Playgroud)

那是行不通的。

我的问题似乎与此非常相似,但除了使用 Win.Forms 和调用 Application.DoEvents() 之外没有真正的解决方案

编辑

我这样修改了我的代码:

Task task = Task.Factory.StartNew(() => ConnectToControlPanel());
            while (task.Status != TaskStatus.RanToCompletion)
            {
                Application.DoEvents();
                Thread.Sleep(500);
            }
Run Code Online (Sandbox Code Playgroud)

这是可行的,回调会在进度上被调用,结果是成功而不是超时。

尽管每次进行外部调用时都必须运行那个丑陋的循环,但感觉不太对劲。

我还尝试过启动另一个不断调用的线程,Application.DoEvents()但这不起作用,所以我假设它与在进行调用的同一线程中运行有关。