Console Application with Message Pump

耗尽温柔 提交于 2021-01-27 06:53:48

问题


I'm trying to write a console application (C# .NET) that makes use of un-managed code in a 3rd party DLL.

The external assembly makes extensive use of callbacks. The sample application I have uses Windows Forms.

The sample code (Windows Forms) makes use of ThreadPool.QueueUserWorkItem

ThreadPool.QueueUserWorkItem(new WaitCallback(ConnectToControlPanel));

It would seem that with windows forms there is a message pump that handles the callbacks. This is not the case with a console app so I need to construct my own.

I've tried adding a reset event

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();
}

That doesn't work.

My problem seems to be very much like this one but there is no real solution other than using Win.Forms and calling Application.DoEvents()

Edit

I modified my code thus:

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

This works, the callbacks get called on progress and the result is successful rather than a timeout.

It doesn't feel right though to have to run that ugly loop every time I make an external call.

I've also tried spinning up another thread that constantly calls Application.DoEvents() but that didn't work, so I'm assuming it's got something to do with running in the same thread that made the call.

来源:https://stackoverflow.com/questions/45387469/console-application-with-message-pump

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!