我正在尝试编写一个控制台应用程序(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()但这不起作用,所以我假设它与在进行调用的同一线程中运行有关。
我正在尝试按照使用 ngrok 进行本地测试的说明进行操作
我使用 C# 示例在本地运行我的事件网格和我的函数在 VS 中运行。但是,当我尝试使用端点订阅我的事件时
https://xxxx.ngrok.io/admin/extensions/EventGridExtensionConfig?functionName=EventGridTrigger
Run Code Online (Sandbox Code Playgroud)
我的本地 ngrok 控制台显示:
POST /admin/extensions/EventGridExtensionConfig 404 Not Found
Run Code Online (Sandbox Code Playgroud)
VS中的函数代码:
[FunctionName("EventGridTrigger")]
public static void Run([EventGridTrigger]EventGridEvent eventGridEvent, TraceWriter log)
{
log.Info(eventGridEvent.Data.ToString());
}
Run Code Online (Sandbox Code Playgroud)