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

时间:2017-07-29 09:04:45

标签: c# .net loops message

我正在尝试编写一个控制台应用程序(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()的线程,但这不起作用,所以我假设它与在调用该调用的同一个线程中运行有关。

0 个答案:

没有答案