我有一个C#windows表单应用程序 该应用程序有一个Windows窗体。 我希望窗体上的按钮单击事件启动管理第三方库的工作线程。
我还有一个C#asp.net Web应用程序。 该应用程序有一个网页(出于此问题的目的)。 我想在网页上点击一下按钮,启动管理相同第三方库的工作线程。
我的工作线程执行以下操作 1.在第三方库上设置回调函数,以便在发生某些事件时可以回叫 2.在第三方库中启动操作(非异步)(最终将调用我的回调)。
我希望回调(我的第三方库调用的回调)向UI发送消息(无论是窗体还是网页)。
我无法退出运行我的回调的堆栈帧,所以我需要回调来通知另一个线程回调 需要数据。然后,其他线程可以确定是否要回调到Windows UI或Web客户端(为此 问题,我对如何回调网络客户端不感兴趣)
当UI收到消息时,我希望UI显示一个对话框,询问用户信息。一旦用户回答 问题和解雇对话框,我想在对话框中捕获的数据返回到回调函数(这是 等待,因为没有数据就无法前进。)
Web UI和Windows窗体UI都可以等待,虽然我的偏好是他们不会,我会处理 来自用户界面的独立部分中的工作者线程的请求,无论其他工作是什么,都保持可见 用户可能正在做。
鉴于截至2016年C#的当前功能集,完成此任务的最佳方法是什么?
基本上,我需要线程之间的双向通信,我需要确保不违反SynchronizationContext(在winforms的情况下)。
我查看了许多答案,其中一些使用了Progress。没有一个答案显示回调等待来自UI的回答,以及处理多个回调的UI。我可以使用旧式线程原语来设计它,但我想使用Task,也许是async / await。这肯定是一种常见的模式,但我似乎无法找到它。使用后台线程回调到UI线程,让UI线程显示内容,收集结果,然后将结果返回给后台线程,现在的最佳做法是什么?